Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
Microsoft .NET Framework incluye un conjunto base de clases que proporciona una implementación del modelo de objetos de documento XML (DOM). El XmlNode, y sus clases derivadas, proporcionan métodos y propiedades que permiten navegar, consultar y modificar el contenido y la estructura de un documento XML.
Cuando el contenido XML se carga en memoria mediante el DOM, los nodos creados contienen información como el nombre del nodo, el tipo de nodo, etc. Puede haber ocasiones en las que se requiera información específica del nodo que las clases base no proporcionan. Por ejemplo, puede que desee ver el número de línea y la posición del nodo. En este caso, puede derivar nuevas clases de las clases DOM existentes y agregar funcionalidad adicional.
Al derivar clases nuevas hay que seguir dos directrices generales:
Se recomienda que nunca derive de la clase XmlNode. En su lugar, se recomienda derivar clases de la clase correspondiente al tipo de nodo que le interese. Por ejemplo, si desea devolver información adicional sobre los nodos de atributo, puede derivar de la XmlAttribute clase .
Excepto en los métodos de creación de nodos, se recomienda que al invalidar una función, llame siempre a la versión base de la misma y, a continuación, agregue el procesamiento adicional.
Crear sus propias instancias de nodo
La XmlDocument clase contiene métodos de creación de nodos. Cuando se carga un archivo XML, se llama a estos métodos para crear los nodos. Se pueden invalidar los métodos de forma que sus instancias de nodo se creen al cargar un documento. Por ejemplo, si ha ampliado la XmlElement clase , heredaría la XmlDocument clase e invalidaría el CreateElement método .
En el ejemplo siguiente se muestra cómo sobrescribir el método CreateElement para devolver su implementación de la clase 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;
}
}
Extensión de una clase
Para ampliar una clase, derive la clase de una de las clases DOM existentes. A continuación, puede invalidar cualquiera de los métodos o propiedades virtuales de la clase base o agregar sus propios.
En el ejemplo siguiente, se crea una nueva clase, que implementa la XmlElement clase y la IXmlLineInfo interfaz . Se definen métodos y propiedades adicionales que permiten a los usuarios recopilar información de línea.
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.
Ejemplo
En el ejemplo siguiente se cuenta el número de elementos de un documento 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());
}
}
Entrada
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>
Salida
Number of elements in book.xml: 3
Controlador de eventos node
La implementación de .NET Framework del DOM también incluye un sistema de eventos que permite recibir y controlar eventos cuando cambian los nodos de un documento XML. Usando las clases XmlNodeChangedEventHandler y XmlNodeChangedEventArgs, puede capturar eventos NodeChanged, NodeChanging, NodeInserted, NodeInserting, NodeRemoved y NodeRemoving.
El proceso de control de eventos funciona exactamente igual en las clases derivadas que en las clases DOM originales.
Para obtener más información sobre el control de eventos de nodo, vea Eventos y XmlNodeChangedEventHandler.
Atributos predeterminados y el método CreateElement
Si va a invalidar el CreateElement método en una clase derivada, los atributos predeterminados no se agregan al crear nuevos elementos al editar el documento. Solo se trata de un problema al editarlo. Dado que el método CreateElement es responsable de agregar atributos predeterminados a un XmlDocument, debe codificar esta funcionalidad en el método CreateElement. Si va a cargar un XmlDocument que incluye atributos predeterminados, serán gestionados correctamente. Para obtener más información sobre los atributos predeterminados, vea Crear nuevos atributos para elementos en el DOM.