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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: