C# Xml Linq-查询 XML 示例一则

作者:vkvi 来源:ITPOW(原创) 日期:2022-3-31

XML

<root>
  <item>
    <unique>1</unique>
    <name>aaa</name>
  </item>
  <item>
    <unique>2</unique>
    <name>bbb</name>
  </item>
</root>

需求

找出 unique 为 id 的 item 的 name。

代码—命名空间

using System;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;

代码-程序

var items = XElement.Parse(xml).Nodes();
var list = items.Where(m => m.XPathSelectElement("unique").Value == id.ToString());
if (list.Count() <= 0)
{
	return;
}

var item = list.First();
var name = item.XPathSelectElement("name").Value;

XElement.Parse(xml) 将整个 Xml 转换成 XElement。

Nodes() 是取其子节点

利用 Where() 过滤不需要的,其中 XPathSelectElement 中的 XPath 根节点是 item,因为前面说了,是取的子节点,而 root 的子节点就是 item,所以现在 item 成为了根节点。

由于我们只取一个,所以用 First()

First() 之后,还是 item 节点不变,所以取 name 时,XPath 的根节点,也是 item。

回顾 XPath

string xml = @"<root>
	<item><unique>1</unique><name>aaa</name></item>
	<item><unique>2</unique><name>bbb</name></item>
	<item><unique>3</unique><name>ccc</name></item>
	<item><unique>1</unique><name>ddd</name></item>
</root>";

var items = XElement.Parse(xml).Nodes();
var list1 = items.Where(m => m.XPathSelectElement("/item/unique").Value == "1"); 
var list2 = items.Where(m => m.XPathSelectElement("/item/unique").Value == "2");
var list3 = items.Where(m => m.XPathSelectElement("//unique").Value == "2");
var list4 = items.Where(m => m.XPathSelectElement("./unique").Value == "1"); // . 是当前节点(即 item),./unique 是当前节点下面的 unique。
var list5 = items.Where(m => m.XPathSelectElement("unique").Value == "1"); // 与 ./unique 是一个意思。
Response.Write(list1.Count()); // 4
Response.Write(list2.Count()); // 0
Response.Write(list3.Count()); // 0
Response.Write(list4.Count()); // 2
Response.Write(list5.Count()); // 2

如上,我们可以看出 list1、list2、list3、list4、list5 的元素数量分别是:4、0、0、2、2

list4、list5 的 XPath 是一个意思,所以数量相同,也能理解。

list1、list2、list3 为什么是 4、0、0 呢?因为咱们 XPath 以“/”、“//”开头,这里就要特别注意了:Where 类似一个 for 循环+判断,但是在这个循环中,这种 XPath 并不是从当前项进行的判断,它是对整个集合的第一项进行的判断

解决办法也很简单,就是像 list4、list5 那样写 XPath,即:XPath 当前项开始,不能是“/”或“//”开头。

类似地,咱们使用了 Last(),后面再跟 XPath,如果发现总是与第一项比较,咱们也得考虑,修改咱们的 XPath 了

相关阅读

相关文章