Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Microsoft .NET Framework включает базовый набор классов, который предоставляет реализацию объектной модели XML-документа (DOM). Производные XmlNodeклассы предоставляют методы и свойства, позволяющие перемещаться, запрашивать и изменять содержимое и структуру XML-документа.
При загрузке XML-содержимого в память с помощью DOM, созданные узлы содержат такие сведения, как имя узла, тип узла и т. д. Могут возникнуть случаи, когда требуются определенные сведения о узле, которые базовые классы не предоставляют. Например, может потребоваться просмотреть номер строки и положение узла. В этом случае можно наследить новые классы из существующих классов DOM и добавить дополнительные функциональные возможности.
Существует два общих руководства при создании новых классов:
Рекомендуется никогда не наследовать от класса XmlNode. Вместо этого рекомендуется наследовать классы от класса, соответствующего типу узла, который вас интересует. Например, если требуется вернуть дополнительные сведения о узлах атрибутов, можно произвести производный класс от XmlAttribute.
За исключением методов создания узла, рекомендуется при переопределении функции всегда вызывать базовую версию функции, а затем добавлять дополнительную обработку.
Создание собственных экземпляров узлов
Класс XmlDocument содержит методы создания узлов. При загрузке XML-файла эти методы вызываются для создания узлов. Эти методы можно переопределить, чтобы экземпляры узлов создавались при загрузке документа. Например, если вы расширили XmlElement класс, вы наследуете XmlDocument класс и переопределите CreateElement метод.
В следующем примере показано, как переопределить метод CreateElement, чтобы вернуть вашу реализацию класса 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;
}
}
Расширение класса
Чтобы расширить класс, наследуйте класс из одного из существующих классов DOM. Затем можно переопределить любые виртуальные методы или свойства в базовом классе или добавить собственные.
В следующем примере создается новый класс, реализующий XmlElement класс и IXmlLineInfo интерфейс. Определены дополнительные методы и свойства, позволяющие пользователям собирать сведения о строке.
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.
Пример
В следующем примере учитывается количество элементов в 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());
}
}
Ввод
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>
Выходные данные
Number of elements in book.xml: 3
Обработчик событий узла
Реализация .NET Framework DOM также включает систему событий, которая позволяет получать и обрабатывать события при изменении узлов в XML-документе.
XmlNodeChangedEventHandler С помощью и XmlNodeChangedEventArgs классов можно записывать NodeChanged, NodeChanging, NodeInserted, и NodeInsertingNodeRemovedNodeRemoving события.
Процесс обработки событий работает точно так же в производных классах, что и в исходных классах DOM.
Дополнительные сведения об обработке событий узла см. в разделе "События и XmlNodeChangedEventHandler".
Атрибуты по умолчанию и метод CreateElement
При переопределении CreateElement метода в производном классе атрибуты по умолчанию не добавляются при создании новых элементов при редактировании документа. Это только проблема при редактировании. CreateElement Так как метод отвечает за добавление атрибутов по умолчанию в объектXmlDocument, необходимо закодировать эту функцию в методеCreateElement. Если вы загружаете XmlDocument, включающий атрибуты по умолчанию, они будут обрабатываться правильно. Дополнительные сведения об атрибутах по умолчанию см. в разделе "Создание новых атрибутов для элементов" в DOM.