Aracılığıyla paylaş


XPath Gezintisi Kullanarak Düğüm Seçme

XML Belgesi Nesne Modeli (DOM), DOM'daki bilgileri sorgulamak için XML Yol Dili (XPath) gezintisini kullanmanıza olanak sağlayan yöntemler içerir. XPath kullanarak tek, belirli bir düğümü veya bazı ölçütlere uyan tüm düğümleri bulabilirsiniz.

XPath Seçme Yöntemleri

DOM sınıfları XPath seçimi için iki yöntem sağlar: SelectSingleNode yöntemi ve SelectNodes yöntemi. yöntemi, SelectSingleNode seçim ölçütlerine uyan ilk düğümü döndürür. yöntemi eşleşen SelectNodes düğümleri içeren bir XmlNodeList döndürür.

Aşağıdaki örnek, yazarın SelectSingleNode soyadının belirtilen ölçütleri karşıladığı ilk book düğümü seçmek için yöntemini kullanır. giriş dosyası olarak bookstore.xml dosyası (bu konunun sonunda sağlanır) kullanılır.

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

Sonraki örnek, fiyatın SelectNodes belirtilen miktardan büyük olduğu tüm kitap düğümlerini seçmek için yöntemini kullanır. Seçili listedeki her kitabın fiyatı program aracılığıyla yüzde on azaltılır. Son olarak, güncelleştirilmiş dosya konsola yazılır. giriş dosyası olarak bookstore.xml dosyası (bu konunun sonunda sağlanır) kullanılır.

' 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);  

Yukarıdaki örnekler, belge öğesinde XPath sorgusunu başlatır. XPath sorgusunun başlangıç noktasını ayarlamak, XPath sorgusunun başlangıç noktası olan bağlam düğümünü ayarlar. Belge öğesinden başlamak istemiyorsanız, ancak belge öğesinin ilk alt öğesinden başlamak istiyorsanız, select deyimini aşağıdaki gibi kodlayabilirsiniz:

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

Tüm XmlNodeList nesneler temel alınan belgeyle eşitlenir. Bu nedenle, düğüm listesinde yineleme yaparsanız ve bir düğümün değerini değiştirirseniz, bu düğüm geldiği belgede de güncelleştirilir. Önceki örnekte, seçilen XmlNodeList bir düğüm değiştirildiğinde temel alınan belgenin de değiştirildiğine dikkat edin.

Not

Temel alınan belge değiştirildiğinde, seçimin yeniden çalıştırılması önerilir. Değiştirilen düğüm, düğümün daha önce değilken düğüm listesine eklenmesine neden olabilecek bir düğümse veya şimdi düğüm listesinden kaldırılmasına neden olabilirse, düğüm listesinin artık doğru olduğunu garanti etmek gerekmez.

XPath İfadelerindeki Ad Alanları

XPath ifadeleri ad alanları içerebilir. Ad alanı çözümlemesi kullanılarak XmlNamespaceManagerdesteklenir. XPath ifadesi bir ön ek içeriyorsa, ön ek ve ad alanı URI çifti öğesine eklenmelidir XmlNamespaceManagerve XmlNamespaceManager veya SelectSingleNode(String, XmlNamespaceManager) yöntemine SelectNodes(String, XmlNamespaceManager) geçirilir. Yukarıdaki kod örneklerde, bookstore.xml belgesinin ad alanını çözümlemek için öğesinin kullanıldığına XmlNamespaceManager dikkat edin.

Not

XPath ifadesi bir ön ek içermiyorsa, ad alanı Tekdüzen Kaynak Tanımlayıcısı'nın (URI) boş ad alanı olduğu varsayılır. XML'niz varsayılan bir ad alanı içeriyorsa, öğesine yine de bir ön ek ve ad alanı URI'sini XmlNamespaceManagereklemeniz gerekir; aksi takdirde hiçbir düğüm seçilmez.

Giriş Dosyası

Bu konudaki örneklerde giriş dosyası olarak kullanılan bookstore.xml dosyası aşağıda verilmiştir:

<?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>  

Ayrıca bkz.