Bagikan melalui


Memperluas DOM

Microsoft .NET Framework menyertakan sekumpulan kelas dasar yang menyediakan implementasi Model Objek Dokumen XML (DOM). XmlNode, dan kelas turunannya, menyediakan metode dan properti yang memungkinkan Anda menavigasi, mengkueri, dan mengubah konten dan struktur dokumen XML.

Ketika konten XML dimuat ke dalam memori menggunakan DOM, simpul yang dibuat berisi informasi seperti nama simpul, jenis node, dan sebagainya. Mungkin ada kesempatan di mana Anda memerlukan informasi node tertentu yang tidak disediakan kelas dasar. Misalnya, Anda mungkin ingin melihat nomor baris dan posisi simpul. Dalam hal ini, Anda dapat memperoleh kelas baru dari kelas DOM yang ada dan menambahkan fungsionalitas tambahan.

Ada dua panduan umum saat mengembangkan kelas baru:

  • Disarankan agar Anda tidak pernah menurunkan dari kelas XmlNode. Sebaliknya, disarankan agar Anda mendapatkan kelas dari kelas yang sesuai dengan jenis node yang Anda minati. Misalnya, jika Anda ingin mengembalikan informasi tambahan pada node atribut, Anda dapat memperoleh dari XmlAttribute kelas .

  • Kecuali untuk metode pembuatan simpul, disarankan bahwa saat meng-override fungsi, Anda harus selalu memanggil versi dasar fungsi dan kemudian menambahkan pemrosesan tambahan.

Membuat Instans Node Anda Sendiri

Kelas XmlDocument berisi metode pembuatan simpul. Ketika file XML dimuat, metode ini dipanggil untuk membuat simpul. Anda dapat menggantikan metode ini sehingga instans simpul Anda dibuat saat dokumen dimuat. Misalnya, jika Anda telah mengembangkan kelas XmlElement, Anda akan mewarisi kelas XmlDocument lalu menimpa metode CreateElement.

Contoh berikut menunjukkan cara mengambil alih CreateElement metode untuk mengembalikan implementasi XmlElement kelas Anda.

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

Memperluas Kelas

Untuk memperluas kelas, dapatkan kelas Anda dari salah satu kelas DOM yang ada. Anda kemudian dapat mengambil alih salah satu metode atau properti virtual di kelas dasar, atau menambahkan metode atau properti Anda sendiri.

Dalam contoh berikut, kelas baru dibuat, yang mengimplementasikan XmlElement kelas dan IXmlLineInfo antarmuka. Metode dan properti tambahan ditetapkan yang memungkinkan pengguna untuk mengumpulkan informasi baris.

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.

Contoh

Contoh berikut menghitung jumlah elemen dalam dokumen 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());

  }
}

Masukan

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>

Keluaran

Number of elements in book.xml: 3

Pengendali Acara Node

Implementasi .NET Framework dari DOM juga menyertakan sistem peristiwa yang memungkinkan Anda menerima dan menangani peristiwa ketika node dalam dokumen XML berubah. Menggunakan kelas XmlNodeChangedEventHandler dan XmlNodeChangedEventArgs, Anda dapat menangkap peristiwa NodeChanged, NodeChanging, NodeInserted, NodeInserting, NodeRemoved, dan NodeRemoving.

Proses penanganan peristiwa berfungsi persis sama di kelas turunan seperti di kelas DOM asli.

Untuk informasi selengkapnya mengenai penanganan peristiwa simpul, lihat Peristiwa dan XmlNodeChangedEventHandler.

Atribut Default dan Metode CreateElement

Jika Anda mengoverride metode CreateElement di kelas turunan, atribut default tidak ditambahkan ketika Anda membuat elemen baru saat mengedit dokumen. Ini hanya masalah saat mengedit. Karena metode CreateElement bertanggung jawab untuk menambahkan atribut default ke XmlDocument, Anda harus mengimplementasikan fungsionalitas ini dalam metode CreateElement. Jika Anda memuat XmlDocument yang menyertakan atribut default, atributnya akan ditangani dengan benar. Untuk informasi selengkapnya tentang atribut default, lihat Membuat Atribut Baru untuk Elemen di DOM.

Lihat juga