现在的位置: 首页 > 综合 > 正文

【引用】xmlpath 操作 xml

2012年03月19日 ⁄ 综合 ⁄ 共 3813字 ⁄ 字号 评论关闭

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd country="USA">
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<price>10.90</price>
</cd>
<cd country="UK">
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<price>9.90</price>
</cd>
<cd country="USA">
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<price>9.90</price>
</cd>
</catalog>

定位节点

XML是树状结构,类似档案系统内数据夹的结构,XPath也类似档案系统的路径命名方式。不过XPath 是一种模式(Pattern),可以选出 XML档案中,路径符合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用:

/catalog/cd/price

如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。以下的语法会选出文件中所有叫做cd的元素(在树中的任何层级都会被选出来):

//cd

 

选择未知的元素

使用星号(Wildcards,*)可以选择未知的元素。下面这个语法会选出/catalog/cd 的所有子元素:

/catalog/cd/*

以下的语法会选出所有catalog的子元素中,包含有price作为子元素的元素。

/catalog/*/price

以下的语法会选出有两层父节点,叫做price的所有元素。

/*/*/price

以下的语法会选择出文件中的所有元素。

//*

要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

 

选择分支

使用中括号可以选择分支。以下的语法从catalog的子元素中取出第一个叫做cd的元素。XPath的定义中没有第0元素这种东西。

/catalog/cd[1]

以下语法选择catalog中的最后一个cd元素:(XPathj并没有定义 first() 这种函式喔,用上例的 [1]就可以取出第一个元素。

/catalog/cd[last()]

以下语法选出含有price子元素的所有/catalog/cd元素。

/catalog/cd[price]

以下语法选出price元素的值等于10.90的所有/catalog/cd元素

/catalog/cd[price=10.90]

以下语法选出price元素的值等于10.90的所有/catalog/cd元素 的price元素

/catalog/cd[price=10.90]/price

 

选择一个以上的路径

使用Or操作数(|)就可以选择一个以上的路径。例如:

/catalog/cd/title | catalog/cd/artist

选择所有title以及artist元素

//title | //artist

选择所有title以及artist以及price元素

//title | //artist | //price

 

选择属性

在XPath中,除了选择元素以外,也可以选择属性。属性都是以@开头。例如选择文件中所有叫做country的属性:

//@country

选择所有含有country这个属性的cd元素:

//cd[@country]

以下语法选择出含有属性的所有cd元素

//cd[@*]

以下语法选择出country属性值为UK的cd元素

//cd[@country='UK']

只要掌握了xpath语法,理论上你就可以访问xml文件中的任意节点和任意值。

微软介绍:

如何用 XPath 表达式查询 XML

  1. 在 Visual Studio .NET 中新建一个 Visual C# .NET 控制台应用程序。

    备注: 本示例使用名为 Books.xml 的文件。您可以创建自己的 Books.xml 文件,也可以使用 .NET 软件开发工具包 (SDK) 快速入门中包括的示例。如果您没有安装”快速入门”而且也不想安装它们,请参阅 Books.xml 下载位置的”参考”部分。如果已经安装了”快速入门”,则该文件位于以下文件夹中:

    Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB

    必须将该文件复制到 \Bin\Debug 文件夹,该文件夹位于您在其中创建该项目的文件夹中。

  2. 确保该项目引用 System.Xml 名称空间。
  3.  Xml  XPath 名称空间上使用 using 语句,这样以后就不需要在代码中限定这些名称空间中的声明了。using 语句必须在所有其他声明之前使用,如下所示:
    using System.Xml; using System.Xml.XPath;
  4. 声明合适的变量。声明 XPathDocument 对象以保存 XML 文档,声明 XpathNavigator 对象以计算 XPath 表达式,声明XPathNodeIterator 对象以迭代通过选定节点。声明 String 对象以保存 XPath 表达式。在 Class1 的 Main 函数中添加声明代码。
    XPathNavigator nav; XPathDocument docNav; XPathNodeIterator NodeIter; String strExpression;
  5. 用示例文件 Books.xml 加载 XPathDocumentXPathDocument 类使用可扩展样式表语言转换 (XSLT) 为 XML 文档处理提供快速和面向性能的缓存。它类似于 XML 文档对象模型 (DOM),但经过了高度优化,以用于 XSLT 处理和 XPath 数据模型。
    // Open the XML. docNav = new XPathDocument(@"c:\books.xml");
  6. 从文档创建 XPathNavigatorXPathNavigator 对象用于进行只读 XPath 查询。XPath 查询可返回结果值或许多节点。
    // Create a navigator to query with XPath. nav = docNav.CreateNavigator();
  7. 创建 XPath 表达式以查找图书的平均价格。这个 XPath 表达式返回单个值。有关 XPath 语法的完整详细信息,请参见”参考”部分中的”XPath 语法”。
    // Find the average cost of a book. // This expression uses standard XPath syntax. strExpression = "sum(/bookstore/book/price) div count(/bookstore/book/price)";
  8. 使用 XPathNavigator 对象的 Evaluate 方法计算 XPath 表达式。Evaluate 方法返回该表达式的结果。
    // Use the Evaluate method to return the evaluated expression. Console.WriteLine("The average cost of the books are {0}", nav.Evaluate(strExpression));
  9. 创建 XPath 表达式以查找价格超过 10 美元的所有图书。这个 XPath 表达式只从 XML 源中返回 Title 节点。
    // Find the title of the books that are greater then $10.00. strExpression = "/bookstore/book/title[../price>10.00]";
  10. 为使用 XPathNavigator  Select 方法选择的节点创建 XPathNodeIteratorXPathNodeIterator 表示 XPath 节点集,因此它支持针对该节点集执行的操作。
    // Select the node and place the results in an iterator. NodeIter = nav.Select(strExpression);
  11. 使用从 XPathNavigator  Select 方法返回的 XPathNodeIterator 遍历选定的节点。在这种情况下,可使用XPathNodeIterator  MoveNext 方法迭代通过选定的所有节点。
    Console.WriteLine("List of expensive books:"); //Iterate through the results showing the element value. while (NodeIter.MoveNext())   { Console.WriteLine("Book Title:{0}", NodeIter.Current.Value);   };
  12. 使用 ReadLine 方法在控制台显示的末尾添加 pause,以便更容易地显示上述结果。
    //Pause Console.ReadLine();
  13. 生成并运行您的项目。请注意,这些结果显示在控制台窗口中。

抱歉!评论已关闭.