Sdílet prostřednictvím


Rozšíření modelu DOM

Rozhraní Microsoft .NET Framework obsahuje základní sadu tříd, které poskytují implementaci modelu DOM (Document Object Model) XML. A XmlNodejeho odvozené třídy poskytuje metody a vlastnosti, které umožňují procházet, dotazovat a upravovat obsah a strukturu dokumentu XML.

Při načtení obsahu XML do paměti pomocí modelu DOM obsahují vytvořené uzly informace, jako je název uzlu, typ uzlu atd. Můžou se vyskytnout situace, kdy potřebujete konkrétní informace o uzlu, které základní třídy neposkytují. Můžete například chtít zobrazit číslo řádku a umístění uzlu. V tomto případě můžete odvodit nové třídy z existujících tříd MODELU DOM a přidat další funkce.

Při odvozování nových tříd existují dva obecné pokyny:

  • Doporučujeme, abyste nikdy neodvozovat z XmlNode třídy. Místo toho doporučujeme odvodit třídy z třídy odpovídající typu uzlu, který vás zajímá. Pokud například chcete vrátit další informace o uzlech atributů, můžete je odvodit z XmlAttribute třídy.

  • S výjimkou metod vytváření uzlů se doporučuje, abyste při přepsání funkce vždy volali základní verzi funkce a pak přidali jakékoli další zpracování.

Vytváření vlastních instancí uzlů

Třída XmlDocument obsahuje metody vytváření uzlů. Při načtení souboru XML se tyto metody volají k vytvoření uzlů. Tyto metody můžete přepsat tak, aby se instance uzlů vytvořily při načtení dokumentu. Pokud jste například rozšířili XmlElement třídu, zdědíte XmlDocument třídu a přepíšete metodu CreateElement .

Následující příklad ukazuje, jak přepsat metodu CreateElement pro vrácení implementace XmlElement třídy.

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

Rozšíření třídy

Chcete-li rozšířit třídu, odvodit třídu z jedné z existujících tříd MODELU DOM. Pak můžete přepsat kteroukoli z virtuálních metod nebo vlastností v základní třídě nebo přidat vlastní.

V následujícím příkladu se vytvoří nová třída, která implementuje XmlElement třídu a IXmlLineInfo rozhraní. Jsou definovány další metody a vlastnosti, které uživatelům umožňují shromažďovat informace o řádci.

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říklad

Následující příklad spočítá počet prvků v dokumentu XML:

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

  }
}

Vstup

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>

Výstup

Number of elements in book.xml: 3

Obslužná rutina události uzlu

Implementace rozhraní .NET Framework modelu DOM obsahuje také systém událostí, který umožňuje přijímat a zpracovávat události při změně uzlů v dokumentu XML. Pomocí a XmlNodeChangedEventHandlerXmlNodeChangedEventArgs tříd můžete zachytit NodeChanged, , NodeChanging, NodeInserted, NodeInsertingNodeRemoveda NodeRemoving události.

Proces zpracování událostí funguje v odvozených třídách přesně stejně jako v původních třídách MODELU DOM.

Další informace o zpracování událostí uzlu naleznete v tématu Události a XmlNodeChangedEventHandler.

Default Attributes and the CreateElement – metoda

Pokud přepisujete metodu CreateElement v odvozené třídě, výchozí atributy se při vytváření nových prvků při úpravách dokumentu nepřidají. Jedná se pouze o problém při úpravách. Vzhledem k tomu, že CreateElement metoda je zodpovědná za přidání výchozích atributů do objektu XmlDocument, musíte tuto funkci v metodě zakódovat CreateElement . Pokud načítáte atribut XmlDocument , který obsahuje výchozí atributy, zpracuje se správně. Další informace o výchozíchatributch

Viz také