Megosztás a következőn keresztül:


A DOM kiterjesztése

A Microsoft .NET-keretrendszer tartalmaz egy alaposztálykészletet, amely az XML-dokumentumobjektum-modell (DOM) implementálását biztosítja. A XmlNode, és annak származtatott osztályai olyan metódusokat és tulajdonságokat biztosítanak, amelyek lehetővé teszik az XML-dokumentumok tartalmának és szerkezetének navigálását, lekérdezését és módosítását.

Ha az XML-tartalom a DOM használatával töltődik be a memóriába, a létrehozott csomópontok olyan információkat tartalmaznak, mint a csomópont neve, a csomópont típusa stb. Előfordulhat, hogy az alaposztályok által nem megadott csomópontadatokra van szükség. Előfordulhat például, hogy meg szeretné tekinteni a csomópont vonalszámát és pozícióját. Ebben az esetben új osztályok származtathatók a meglévő DOM-osztályokból, és további funkciókat adhat hozzá.

Az új osztályok származtatásának két általános irányelve van:

  • Javasoljuk, hogy soha ne származtasd az XmlNode osztályból. Ehelyett javasoljuk, hogy a kívánt csomóponttípusnak megfelelő osztályból származtassunk osztályokat. Ha például további információkat szeretne visszaadni az attribútumcsomópontokról, az osztályból származtathatja.XmlAttribute

  • A csomópontlétrehozási módszerek kivételével javasoljuk, hogy egy függvény felülírásakor mindig hívja meg a függvény alapverzióját, majd adjon hozzá további feldolgozást.

Saját csomópontpéldányok létrehozása

Az XmlDocument osztály csomópontlétrehozási módszereket tartalmaz. Xml-fájl betöltésekor a rendszer meghívja ezeket a metódusokat a csomópontok létrehozásához. Ezeket a metódusokat felülbírálhatja, így a csomópontpéldányok a dokumentum betöltésekor jönnek létre. Ha például kiterjesztette az osztályt XmlElement , örökölheti az osztályt XmlDocument , és felülbírálhatja a metódust CreateElement .

Az alábbi példa bemutatja, hogyan bírálhatja felül a metódust az CreateElement osztály implementációjának visszaadásához XmlElement .

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

Osztály kiterjesztése

Egy osztály kiterjesztéséhez származtathatja az osztályt az egyik meglévő DOM-osztályból. Ezután felülbírálhatja az alaposztály bármely virtuális metódusát vagy tulajdonságát, vagy hozzáadhatja a sajátját.

A következő példában létrejön egy új osztály, amely megvalósítja az XmlElement osztályt és a IXmlLineInfo felületet. További metódusok és tulajdonságok definiálva vannak, amelyek lehetővé teszik a felhasználók számára a sorinformációk gyűjtését.

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.

Példa

Az alábbi példa egy XML-dokumentum elemeinek számát számítja ki:

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());

  }
}

Bevitel

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>

Hozam

Number of elements in book.xml: 3

Csomópont eseménykezelője

A DOM .NET-keretrendszer implementációja egy eseményrendszert is tartalmaz, amely lehetővé teszi események fogadását és kezelését, amikor egy XML-dokumentum csomópontjai megváltoznak. Az és az XmlNodeChangedEventHandlerXmlNodeChangedEventArgs osztályok használatával rögzíthet NodeChanged, NodeChanging, NodeInserted, NodeInserting, , , NodeRemoved, és NodeRemoving eseményeket.

Az eseménykezelési folyamat pontosan ugyanúgy működik származtatott osztályokban, mint az eredeti DOM-osztályokban.

A csomópontesemények kezelésével kapcsolatos további információkért lásd : Események és XmlNodeChangedEventHandler.

Alapértelmezett attribútumok és a CreateElement metódus

Ha egy származtatott osztályban felülírja a metódust, a CreateElement rendszer nem ad hozzá alapértelmezett attribútumokat, amikor új elemeket hoz létre a dokumentum szerkesztésekor. Ez csak a szerkesztés során merült fel. Mivel a CreateElement metódus az alapértelmezett attribútumok hozzáadásáért felelős, XmlDocumentezt a funkciót a CreateElement metódusban kell kódokkal ellátnia. Ha olyan fájlt tölt be XmlDocument , amely alapértelmezett attribútumokat tartalmaz, azok kezelése megfelelően történik. Az alapértelmezett attribútumokkal kapcsolatos további információkért lásd : Új attribútumok létrehozása az elemekhez a DOM-ban.

Lásd még