Estensione del DOMExtending the DOM

Microsoft .NET Framework comprende un set di classi di base che fornisce l'implementazione del modello DOM XML (Document Object Model).The Microsoft .NET Framework includes a base set of classes that provides an implementation of the XML Document Object Model (DOM). Tramite XmlNode e le classi derivate vengono forniti metodi e proprietà che consentono di esplorare, eseguire query e modificare il contenuto e la struttura di un documento XML.The XmlNode, and its derived classes, provides methods and properties that allow you to navigate, query, and modify the content and structure of an XML document.

Quando il contenuto dell'XML è caricato in memoria tramite il DOM, i nodi creati contengono informazioni quali il nome del nodo, il tipo di nodo e così via.When XML content is loaded into memory using the DOM, the nodes created contain information such as node name, node type, and so on. In alcuni casi è possibile che siano necessarie informazioni specifiche sul nodo che non vengono fornite dalle classi di base.There may be occasions where you require specific node information that the base classes do not provide. È possibile, ad esempio, che si desideri conoscere il numero di riga e la posizione del nodo.For example, you may want to see the line number and position of the node. In questo caso è possibile derivare nuove classi dalle classi esistenti del DOM e aggiungere ulteriori funzionalità.In this case, you can derive new classes from the existing DOM classes and add additional functionality.

La derivazione di nuove classi è soggetta a due linee guida generali:There are two general guidelines when deriving new classes:

  • Si consiglia di non eseguire mai una derivazione dalla classe XmlNode.It is recommended that you never derive from the XmlNode class. Si consiglia invece di eseguire la derivazione delle classi dalla classe corrispondente al tipo di nodo a cui si è interessati.Instead, it is recommended that you derive classes from the class corresponding to the node type that you are interested in. Se ad esempio si desidera restituire ulteriori informazioni sui nodi degli attributi, è possibile eseguire la derivazione dalla classe XmlAttribute.For example, if you want to return additional information on attribute nodes, you can derive from the XmlAttribute class.

  • Ad eccezione dei metodi per la creazione dei nodi, se si esegue l'override di una funzione si consiglia di chiamare sempre la versione di base della funzione e di aggiungervi un'eventuale elaborazione aggiuntiva.Except for the node creation methods, it is recommended that when overriding a function, you should always call the base version of the function and then add any additional processing.

Creazione di istanze dei nodiCreating Your Own Node Instances

La classe XmlDocument contiene i metodi per la creazione di nodi.The XmlDocument class contains node creation methods. Quando viene caricato un file XML, questi metodi vengono chiamati per creare i nodi.When an XML file is loaded, these methods are called to create the nodes. È possibile eseguire l'override di questi metodi in modo che le istanze dei nodi vengano create quando viene caricato un documento.You can override these methods so that your node instances are created when a document is loaded. Se ad esempio è stata estesa la classe XmlElement, viene ereditata la classe XmlDocument e viene eseguito l'override del metodo CreateElement.For example, if you have extended the XmlElement class, you would inherit the XmlDocument class and override the CreateElement method.

Nell'esempio seguente viene illustrato come eseguire l'override del metodo CreateElement per restituire l'implementazione della classe XmlElement.The following example shows how to override the CreateElement method to return your implementation of the XmlElement class.

Class LineInfoDocument  
    Inherits XmlDocument  
        Public Overrides Function CreateElement(prefix As String, localname As String, nsURI As String) As XmlElement  
        Dim elem As New LineInfoElement(prefix, localname, nsURI, Me)  
        Return elem  
    End Function 'CreateElement  
End Class 'LineInfoDocument  
class LineInfoDocument : XmlDocument {  
  public override XmlElement CreateElement(string prefix, string localname, string nsURI) {  
  LineInfoElement elem = new LineInfoElement(prefix, localname, nsURI, this);  
  return elem;  
  }  

Estensione di una classeExtending a Class

Per estendere una classe, derivare la classe da una delle classi esistenti del DOM.To extend a class, derive your class from one of the existing DOM classes. È possibile quindi eseguire l'override dei metodi o delle proprietà virtuali nella classe di base oppure aggiungere quelli di propria creazione.You can then override any of the virtual methods or properties in the base class, or add your own.

Nell'esempio seguente viene creata una nuova classe, che implementa la classe XmlElement e l'interfaccia IXmlLineInfo.In the following example, a new class is created, which implements the XmlElement class and the IXmlLineInfo interface. Sono definiti metodi e proprietà aggiuntivi per consentire all'utente di raccogliere informazioni sulla riga.Additional methods and properties are defined which allows users to gather line information.

Class LineInfoElement  
   Inherits XmlElement  
   Implements IXmlLineInfo  
   Private lineNumber As Integer = 0  
   Private linePosition As Integer = 0  

   Friend Sub New(prefix As String, localname As String, nsURI As String, doc As XmlDocument)  
      MyBase.New(prefix, localname, nsURI, doc)  
      CType(doc, LineInfoDocument).IncrementElementCount()  
   End Sub 'New  

   Public Sub SetLineInfo(linenum As Integer, linepos As Integer)  
      lineNumber = linenum  
      linePosition = linepos  
   End Sub 'SetLineInfo  

   Public ReadOnly Property LineNumber() As Integer  
      Get  
         Return lineNumber  
      End Get  
   End Property  

   Public ReadOnly Property LinePosition() As Integer  
      Get  
         Return linePosition  
      End Get  
   End Property  

   Public Function HasLineInfo() As Boolean  
      Return True  
   End Function 'HasLineInfo  
End Class 'LineInfoElement ' End LineInfoElement class.  
class LineInfoElement : XmlElement, IXmlLineInfo {  
   int lineNumber = 0;  
   int linePosition = 0;  
   internal LineInfoElement( string prefix, string localname, string nsURI, XmlDocument doc ) : base( prefix, localname, nsURI, doc ) {  
       ( (LineInfoDocument)doc ).IncrementElementCount();  
  }     
  public void SetLineInfo( int linenum, int linepos ) {  
      lineNumber = linenum;  
      linePosition = linepos;  
  }  
  public int LineNumber {  
     get {  
       return lineNumber;  
     }  
  }  
  public int LinePosition {  
      get {  
        return linePosition;  
      }  
  }  
  public bool HasLineInfo() {   
    return true;   
  }  
} // End LineInfoElement class.  

EsempioExample

Nell'esempio seguente viene contato il numero di elementi in un documento XML.The following example counts the number of elements in an XML document.

Imports System  
Imports System.Xml  
Imports System.IO  

 _  

Class LineInfoDocument  
   Inherits XmlDocument  

   Private elementCount As Integer  

   Friend Sub New()  
      elementCount = 0  
   End Sub 'New  

   Public Overrides Function CreateElement(prefix As String, localname As String, nsURI As String) As XmlElement  
      Dim elem As New LineInfoElement(prefix, localname, nsURI, Me)  
      Return elem  
   End Function 'CreateElement  

   Public Sub IncrementElementCount()  
      elementCount += 1  
   End Sub 'IncrementElementCount  

   Public Function GetCount() As Integer  
      Return elementCount  
   End Function 'GetCount  
End Class 'LineInfoDocument  
 _ 'End LineInfoDocument class.  

Class LineInfoElement  
   Inherits XmlElement  

   Friend Sub New(prefix As String, localname As String, nsURI As String, doc As XmlDocument)  
      MyBase.New(prefix, localname, nsURI, doc)  
      CType(doc, LineInfoDocument).IncrementElementCount()  
   End Sub 'New  
End Class 'LineInfoElement  
 _ 'End LineInfoElement class.  

Public Class Test  

   Private filename As [String] = "book.xml"  

   Public Shared Sub Main()  

      Dim doc As New LineInfoDocument()  
      doc.Load(filename)  
      Console.WriteLine("Number of elements in {0}: {1}", filename, doc.GetCount())  
   End Sub 'Main   
End Class 'Test  
using System;  
using System.Xml;  
using System.IO;  

class LineInfoDocument : XmlDocument {  

  int elementCount;  
  internal LineInfoDocument():base() {  
    elementCount = 0;  
  }  

  public override XmlElement CreateElement( string prefix, string localname, string nsURI) {  
    LineInfoElement elem = new LineInfoElement(prefix, localname, nsURI, this );  
    return elem;  
  }  

  public void IncrementElementCount() {  
     elementCount++;  
  }  

  public int GetCount() {  
     return elementCount;  
  }  
} // End LineInfoDocument class.  

class LineInfoElement:XmlElement {  

    internal LineInfoElement( string prefix, string localname, string nsURI, XmlDocument doc ):base( prefix,localname,nsURI, doc ){  
      ((LineInfoDocument)doc).IncrementElementCount();  
    }     
} // End LineInfoElement class.  

public class Test {  

  const String filename = "book.xml";  
  public static void Main() {  

     LineInfoDocument doc =new LineInfoDocument();  
     doc.Load(filename);      
     Console.WriteLine("Number of elements in {0}: {1}", filename, doc.GetCount());  

  }  
}   
InputInput

books.xmlbook.xml

<!--sample XML fragment-->  
<book genre='novel' ISBN='1-861001-57-5' misc='sale-item'>  
  <title>The Handmaid's Tale</title>  
  <price>14.95</price>  
</book>  
OutputOutput
Number of elements in book.xml: 3  

Un esempio in cui viene illustrato come estendere le classi del DOM XML (System.Xml) è riportato in www.gotdotnet.com/userfiles/XMLDom/extendDOM.zip.For an example showing how to extend the XML DOM classes (System.Xml), see www.gotdotnet.com/userfiles/XMLDom/extendDOM.zip.

Gestore degli eventi dei nodiNode Event Handler

Nell'implementazione del DOM da parte di .NET Framework è compreso anche un sistema di eventi che consente di ricevere e gestire gli eventi quando i nodi di un documento XML vengono modificati.The .NET Framework implementation of the DOM also includes an event system that enables you to receive and handle events when nodes in an XML document change. Usando le classi XmlNodeChangedEventHandler e XmlNodeChangedEventArgs, è possibile acquisire gli eventiNodeChanged, NodeChanging, NodeInserted, NodeInserting, NodeRemoved e NodeRemoving.Using the XmlNodeChangedEventHandler and XmlNodeChangedEventArgs classes, you can capture NodeChanged, NodeChanging, NodeInserted, NodeInserting, NodeRemoved, and NodeRemoving events.

Il processo di gestione degli eventi nelle classi derivate è identico a quello nelle classi originali del DOM.The event-handling process works exactly the same in derived classes as it would in the original DOM classes.

Per altre informazioni sulla gestione degli eventi del nodo, vedere Eventi e XmlNodeChangedEventHandler.For more information regarding node event handling, see Events and XmlNodeChangedEventHandler.

Attributi predefiniti e metodo CreateElementDefault Attributes and the CreateElement Method

Se si esegue l'override del metodo CreateElement in una classe derivata, gli attributi predefiniti non vengono aggiunti alla creazione di nuovi elementi durante la modifica del documento.If you are overriding the CreateElement method in a derived class, default attributes are not added when you are creating new elements while editing the document. Questo problema si verifica solo durante la modifica.This is only an issue while editing. Poiché il metodo CreateElement è responsabile dell'aggiunta di attributi predefiniti a un XmlDocument, è necessario codificare questa funzionalità nel metodo CreateElement.Because the CreateElement method is responsible for adding default attributes to an XmlDocument, you must code this functionality in the CreateElement method. Se si carica un XmlDocument in cui sono compresi attributi predefiniti, questi verranno gestiti correttamente.If you are loading an XmlDocument that includes default attributes, they will be handled correctly. Per altre informazioni sugli attributi predefiniti, vedere Creazione di nuovi attributi per gli elementi nel DOM.For more information on default attributes, see Creating New Attributes for Elements in the DOM.

Vedere ancheSee Also

Modello DOM (Document Object Mode) XMLXML Document Object Model (DOM)