Freigeben über


Erweitern des DOM

Das Microsoft .NET Framework enthält einen Basissatz von Klassen, die eine Implementierung des XML-Dokumentobjektmodells (DOCUMENT Object Model, DOM) bereitstellt. Die XmlNodeund die abgeleiteten Klassen stellen Methoden und Eigenschaften bereit, mit denen Sie navigieren, abfragen und ändern können, um den Inhalt und die Struktur eines XML-Dokuments zu ändern.

Wenn XML-Inhalte mithilfe des DOM in den Arbeitsspeicher geladen werden, enthalten die erstellten Knoten Informationen wie Knotenname, Knotentyp usw. Es kann vorkommen, dass Sie bestimmte Knoteninformationen benötigen, die von den Basisklassen nicht bereitgestellt werden. Sie können z. B. die Zeilennummer und position des Knotens anzeigen. In diesem Fall können Sie neue Klassen von den vorhandenen DOM-Klassen ableiten und zusätzliche Funktionen hinzufügen.

Beim Ableiten neuer Klassen gibt es zwei allgemeine Richtlinien:

  • Es wird empfohlen, nie von der Klasse XmlNode abzuleiten. Stattdessen wird empfohlen, Klassen von der Klasse abzuleiten, die dem Knotentyp entspricht, an dem Sie interessiert sind. Wenn Sie beispielsweise zusätzliche Informationen zu Attributknoten zurückgeben möchten, können Sie von der XmlAttribute Klasse ableiten.

  • Mit Ausnahme der Knotenerstellungsmethoden wird empfohlen, beim Überschreiben einer Funktion immer die Basisversion der Funktion aufzurufen und dann weitere Verarbeitungen hinzuzufügen.

Erstellen von eigenen Knoteninstanzen

Die XmlDocument Klasse enthält Knotenerstellungsmethoden. Wenn eine XML-Datei geladen wird, werden diese Methoden aufgerufen, um die Knoten zu erstellen. Sie können diese Methoden überschreiben, damit Ihre Knoteninstanzen beim Laden eines Dokuments erstellt werden. Wenn Sie beispielsweise die XmlElement Klasse erweitert haben, erben Sie die XmlDocument Klasse und überschreiben die CreateElement Methode.

Das folgende Beispiel zeigt, wie Sie die CreateElement Methode überschreiben, um die Implementierung der XmlElement Klasse zurückzugeben.

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;
    }
}

Erweitern einer Klasse

Um eine Klasse zu erweitern, leiten Sie Ihre Klasse von einer der vorhandenen DOM-Klassen ab. Sie können dann eine der virtuellen Methoden oder Eigenschaften in der Basisklasse überschreiben oder eigene hinzufügen.

Im folgenden Beispiel wird eine neue Klasse erstellt, die die XmlElement Klasse und die IXmlLineInfo Schnittstelle implementiert. Zusätzliche Methoden und Eigenschaften werden definiert, sodass Benutzer Zeileninformationen sammeln können.

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

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

   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
End Class ' 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.

Beispiel

Im folgenden Beispiel wird die Anzahl der Elemente in einem XML-Dokument gezählt:

Imports System.Xml
Imports System.IO

Class LineInfoDocument
   Inherits XmlDocument

   Private elementCount As Integer

   Friend Sub New()
      elementCount = 0
   End Sub

   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

   Public Sub IncrementElementCount()
      elementCount += 1
   End Sub

   Public Function GetCount() As Integer
      Return elementCount
   End Function
End Class '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
End Class
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());

  }
}

Eingabe

book.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>

Ausgabe

Number of elements in book.xml: 3

Node-Ereignishandler

Die .NET Framework-Implementierung des DOM umfasst auch ein Ereignissystem, das es Ihnen ermöglicht, Ereignisse zu empfangen und zu verarbeiten, wenn sich die Knoten in einem XML-Dokument ändern. Mithilfe der XmlNodeChangedEventHandler und XmlNodeChangedEventArgs Klassen können Sie NodeChanged, NodeChanging, NodeInserted, NodeInserting, NodeRemoved und NodeRemoving Ereignisse erfassen.

Der Ereignisbehandlungsprozess funktioniert genau so in abgeleiteten Klassen wie in den ursprünglichen DOM-Klassen.

Weitere Informationen zur Knotenereignisbehandlung finden Sie unter "Ereignisse und XmlNodeChangedEventHandler".

Standardattribute und die CreateElement-Methode

Wenn Sie die CreateElement Methode in einer abgeleiteten Klasse außer Kraft setzen, werden beim Bearbeiten des Dokuments keine Standardattribute hinzugefügt, wenn Sie neue Elemente erstellen. Dies ist nur ein Problem beim Bearbeiten. Da die Methode für das CreateElement Hinzufügen von Standardattributen zu einem XmlDocumentAttribut verantwortlich ist, müssen Sie diese Funktionalität in der CreateElement Methode codieren. Wenn Sie ein XmlDocument Objekt laden, das Standardattribute enthält, werden diese ordnungsgemäß behandelt. Weitere Informationen zu Standardattributen finden Sie unter Creating New Attributes for Elements in the DOM.

Siehe auch