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
, NodeInserting
NodeRemoved
a 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