Megosztás a következőn keresztül:


Csomópontok kiválasztása XPath-navigációval

Az XML-dokumentumobjektum-modell (DOM) olyan metódusokat tartalmaz, amelyek lehetővé teszik az XML Path Language (XPath) navigáció használatát a DOM adatainak lekérdezéséhez. Az XPath használatával egyetlen, adott csomópontot kereshet, vagy megkeresheti az összes olyan csomópontot, amely megfelel bizonyos feltételeknek.

XPath kiválasztási metódusok

A DOM-osztályok két módszert biztosítanak az XPath-kiválasztáshoz: a SelectSingleNode metódust és a metódust SelectNodes . A SelectSingleNode metódus a kiválasztási feltételeknek megfelelő első csomópontot adja vissza. A SelectNodes metódus egy olyan csomópontot XmlNodeList ad vissza, amely az egyező csomópontokat tartalmazza.

Az alábbi példa a SelectSingleNode metódus használatával választja ki azt az első book csomópontot, amelyben a szerző vezetékneve megfelel a megadott feltételeknek. A bookstore.xml fájl (amely a jelen témakör végén található) lesz a bemeneti fájl.

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

A következő példa a SelectNodes metódus használatával választja ki az összes olyan könyvcsomópontot, amelyben az ár nagyobb, mint egy megadott összeg. A kiválasztott listában szereplő összes könyv ára ezután tíz százalékkal lesz programozott módon csökkentve. Végül a frissített fájl a konzolra lesz írva. A bookstore.xml fájl (amely a jelen témakör végén található) lesz a bemeneti fájl.

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

A fenti példák elindítják az XPath-lekérdezést a dokumentumelemnél. Az XPath-lekérdezés kiindulási pontjának beállítása beállítja a környezeti csomópontot, amely az XPath-lekérdezés kiindulópontja. Ha nem a dokumentumelemnél szeretne elindulni, de a dokumentumelem első gyermekétől szeretné kezdeni, a kijelölési utasítást az alábbiak szerint kódálhatja:

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

A rendszer minden XmlNodeList objektumot szinkronizál az alapul szolgáló dokumentummal. Ezért ha végigvezeti a csomópontlistán, és módosítja egy csomópont értékét, a csomópont is frissül a kapott dokumentumban. Figyelje meg az előző példában, hogy amikor egy csomópont módosul a kijelölt XmlNodeList dokumentumban, az alapul szolgáló dokumentum is módosul.

Feljegyzés

A mögöttes dokumentum módosításakor célszerű újrafuttatni a kijelölést. Ha a módosított csomópont azt okozhatja, hogy a csomópontot hozzáadják a csomópontlistához, ha korábban nem volt, vagy ha most eltávolítják a csomópontlistáról, akkor nincs garancia arra, hogy a csomópontlista pontos.

Névterek az XPath-kifejezésekben

Az XPath-kifejezések tartalmazhatnak névtereket. A névtérfeloldás a XmlNamespaceManager. Ha az XPath-kifejezés tartalmaz egy előtagot, az előtagot és a névtér URI-párt hozzá kell adni a XmlNamespaceManager, és a rendszer átadja a XmlNamespaceManagerSelectNodes(String, XmlNamespaceManager)SelectSingleNode(String, XmlNamespaceManager) metódusnak. Figyelje meg, hogy a fenti példakód a XmlNamespaceManager bookstore.xml dokumentum névterének feloldására szolgál.

Feljegyzés

Ha az XPath kifejezés nem tartalmaz előtagot, feltételezzük, hogy a névtér egységes erőforrás-azonosítója (URI) az üres névtér. Ha az XML tartalmaz egy alapértelmezett névteret, akkor is hozzá kell adnia egy előtagot és egy névtér URI-t a XmlNamespaceManager; ellenkező esetben nem lesznek kijelölve csomópontok.

Bemeneti fájl

A jelen témakör példáiban a következő bookstore.xml fájl használható bemeneti fájlként:

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

Lásd még