在XPath中返回具有特定条件的相同XML Doc结构

时间:2015-11-28 13:45:06

标签: c# asp.net xml xpath xquery

我在页面http://www.w3schools.com/xml/xml_xpath.asp

中有类似于xml的xml文档
<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book category="cooking">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="children">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="web">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="web">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>

问题是如何使用对应于某个值的元素返回此文档?如何编写XPath或XQuery命令?

例如,搜索标题包含“学习”,然后返回xml doc应该是:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="web">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>
</bookstore>

如何获得此结果?

另一个问题如何用忽略字符的情况进行搜索,所以'学习'应该返回相同的结果?

3 个答案:

答案 0 :(得分:0)

使用XML Linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> book = doc.Descendants("book").Where(x => x.Element("title").Value.Contains("Learn")).ToList();

            XDocument filteredDoc = XDocument.Parse("<?xml version=\"1.0\" encoding=\"UTF-8\"?><bookstore></bookstore>");
            XElement root = (XElement)filteredDoc.FirstNode;
            root.Add(book);
        }

    }
}​

答案 1 :(得分:0)

我希望有帮助

for $d in doc('books')//book[title[contains(text(),'Beginning')]]
return <bookstore> {$d} </bookstore>

但是,此解决方案无法处理忽略字符的情况。

答案 2 :(得分:0)

使用XQuery,您可以执行以下操作:

<bookstore>
{
    for $d in //book[contains(lower-case(title),'learning')]
    return  $d
}
</bookstore>

<强> Xpathtester Demo

请注意,只有一个<bookstore>包含返回的所有匹配的<book>元素,并注意使用lower-case()函数来“忽略”图书标题中的字符大小写匹配过程。