Memilih Node Menggunakan Navigasi JalurX

Model Objek Dokumen (DOM) XML berisi metode yang memungkinkan Anda menggunakan navigasi Bahasa Jalur XML (JalurX) untuk menanyakan informasi di DOM. Anda dapat menggunakan JalurX untuk menemukan satu simpul tertentu atau untuk menemukan semua simpul yang cocok dengan beberapa kriteria.

Metode Pemilihan JalurX

Kelas DOM menyediakan dua metode untuk pemilihan JalurX: metode SelectSingleNode dan metode SelectNodes. Metode SelectSingleNode mengembalikan node pertama yang cocok dengan kriteria pilihan. Metode SelectNodes mengembalikan XmlNodeList yang berisi node yang cocok.

Contoh berikut menggunakan metode SelectSingleNode untuk memilih node book pertama tempat nama belakang penulis memenuhi kriteria yang ditentukan. File bookstore.xml (yang disediakan di akhir topik ini) digunakan sebagai file input.

Dim doc As New XmlDocument()  
doc.Load("bookstore.xml")  
Dim root As XmlNode = doc.DocumentElement  
  
' Add the namespace.  
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)  
nsmgr.AddNamespace("bk", "urn:newbooks-schema")  
  
' Select and display the first node in which the author's
' last name is Kingsolver.  
Dim node As XmlNode = root.SelectSingleNode( _  
     "descendant::bk:book[bk:author/bk:last-name='Kingsolver']", nsmgr)  
Console.WriteLine(node.InnerXml)  
// Load the document and set the root element.  
XmlDocument doc = new XmlDocument();  
doc.Load("bookstore.xml");  
XmlNode root = doc.DocumentElement;  
  
// Add the namespace.  
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);  
nsmgr.AddNamespace("bk", "urn:newbooks-schema");  
  
// Select and display the first node in which the author's
// last name is Kingsolver.  
XmlNode node = root.SelectSingleNode(  
    "descendant::bk:book[bk:author/bk:last-name='Kingsolver']", nsmgr);  
Console.WriteLine(node.InnerXml);  

Contoh berikutnya menggunakan metode SelectNodes untuk memilih semua node buku tempat harganya lebih besar dari jumlah yang ditentukan. Harga untuk setiap buku dalam daftar yang dipilih kemudian dikurangi secara terprogram sebesar sepuluh persen. Terakhir, file yang diperbarui ditulis ke konsol. File bookstore.xml (yang disediakan di akhir topik ini) digunakan sebagai file input.

' Load the document and set the root element.  
Dim doc As New XmlDocument()  
doc.Load("bookstore.xml")  
Dim root As XmlNode = doc.DocumentElement  
  
' Add the namespace.  
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)  
nsmgr.AddNamespace("bk", "urn:newbooks-schema")  
  
' Select all nodes where the book price is greater than 10.00.  
Dim nodeList As XmlNodeList = root.SelectNodes( _  
     "descendant::bk:book[bk:price>10.00]", nsmgr)  
For Each book As XmlNode In nodeList  
     Dim price As Double  
     price = Math.Round(Convert.ToSingle( _  
          book.LastChild.InnerText) * 0.9, 2)  
     book.LastChild.InnerText = price.ToString()  
Next  
  
' Display the updated document.  
doc.Save(Console.Out)  
// Load the document and set the root element.  
XmlDocument doc = new XmlDocument();  
doc.Load("bookstore.xml");  
XmlNode root = doc.DocumentElement;  
  
// Add the namespace.  
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);  
nsmgr.AddNamespace("bk", "urn:newbooks-schema");  
  
// Select all nodes where the book price is greater than 10.00.  
XmlNodeList nodeList = root.SelectNodes(  
     "descendant::bk:book[bk:price>10.00]", nsmgr);  
foreach (XmlNode book in nodeList)  
{  
     // Discount prices by 10%.  
     double price;  
     price = Math.Round(Convert.ToSingle(  
          book.LastChild.InnerText) * 0.9, 2);  
     book.LastChild.InnerText = price.ToString();  
}  
  
// Display the updated document.  
doc.Save(Console.Out);  

Contoh di atas memulai kueri JalurX di elemen dokumen. Mengatur titik awal untuk kueri JalurX mengatur node konteks, yang merupakan titik awal untuk kueri JalurX. Jika Anda tidak ingin memulai di elemen dokumen, tetapi ingin memulai dari turunan pertama elemen dokumen, Anda dapat mengodekan pernyataan pilih sebagai berikut:

doc.DocumentElement.FirstChild.SelectNodes(. . . )  
this doc.DocumentElement.FirstChild.SelectNodes(. . .);  

Semua objek XmlNodeList disinkronkan dengan dokumen yang mendasarinya. Oleh karena itu, jika Anda melakukan iterasi melalui daftar node dan memodifikasi nilai node, node tersebut juga diperbarui dalam dokumen asalnya. Perhatikan dalam contoh sebelumnya bahwa ketika node dimodifikasi dalam XmlNodeList yang dipilih, dokumen yang mendasarinya juga dimodifikasi.

Catatan

Ketika dokumen yang mendasarinya dimodifikasi, sebaiknya jalankan ulang pilihan. Jika node yang dimodifikasi adalah node yang dapat menyebabkan node ditambahkan ke daftar node ketika sebelumnya tidak, atau sekarang akan menyebabkannya dihapus dari daftar node, tidak ada jaminan bahwa daftar node sekarang akurat.

Namespace layanan dalam Ekspresi JalurX

Ekspresi JalurX dapat menyertakan namespace layanan. Resolusi namespace layanan didukung menggunakan XmlNamespaceManager. Jika ekspresi JalurX menyertakan awalan, pasangan awalan dan URI namespace layanan harus ditambahkan ke XmlNamespaceManager, dan XmlNamespaceManager diteruskan ke metode SelectNodes(String, XmlNamespaceManager) atau SelectSingleNode(String, XmlNamespaceManager). Perhatikan bahwa contoh kode di atas menggunakan XmlNamespaceManager untuk menyelesaikan namespace layanan dokumen bookstore.xml.

Catatan

Jika ekspresi JalurX tidak menyertakan awalan, diasumsikan bahwa Uniform Resource Identifier (URI) namespace layanan adalah namespace layanan kosong. Jika XML Anda menyertakan namespace layanan default, Anda masih harus menambahkan awalan dan URI namespace layanan ke XmlNamespaceManager; jika tidak, tidak ada node yang akan dipilih.

File input

Berikut ini adalah file bookstore.xml yang digunakan sebagai file input dalam contoh pada topik ini:

<?xml version='1.0'?>  
<bookstore xmlns="urn:newbooks-schema">  
  <book genre="novel" style="hardcover">  
    <title>The Handmaid's Tale</title>  
    <author>  
      <first-name>Margaret</first-name>  
      <last-name>Atwood</last-name>  
    </author>  
    <price>19.95</price>  
  </book>  
  <book genre="novel" style="other">  
    <title>The Poisonwood Bible</title>  
    <author>  
      <first-name>Barbara</first-name>  
      <last-name>Kingsolver</last-name>  
    </author>  
    <price>11.99</price>  
  </book>  
  <book genre="novel" style="paperback">  
    <title>The Bean Trees</title>  
    <author>  
      <first-name>Barbara</first-name>  
      <last-name>Kingsolver</last-name>  
    </author>  
    <price>5.99</price>  
  </book>  
</bookstore>  

Lihat juga