gpt4 book ai didi

c# - XElement 或 XDocument 上的 XPathEvaluate 之间的区别?

转载 作者:行者123 更新时间:2023-11-30 13:48:08 33 4
gpt4 key购买 nike

在 C# 程序的某处,我需要从 xml 结构中获取属性值。我可以直接将此 xml 结构作为 XElement 访问,并使用简单的 xpath 字符串来获取属性。但是,使用 XPathEvaluate,大多数时候我得到一个空数组。 (是的,有时会返回属性,但大多数情况下它不会...对于完全相同的 XElement 和 xpath 字符串...)但是,如果我首先将 xml 转换为字符串并将其重新解析为 XDocument,我总是会取回该属性。有人可以解释这种行为吗? (我正在使用 .NET 3.5)

主要返回空 IEnumerable 的代码:

string xpath = "/exampleRoot/exampleSection[@name='test']/@value";
XElement myXelement = RetrieveXElement();
((IEnumerable)myXElement.XPathEvaluate(xpath)).Cast<XAttribute>().FirstOrDefault().Value;

始终有效的代码(我得到我的属性值):

string xpath = "/exampleRoot/exampleSection[@name='test']/@value";
string myXml = RetrieveXElement().ToString();
XDocument xdoc = XDocument.Parse(myXml);
((IEnumerable)xdoc.XPathEvaluate(xpath)).Cast<XAttribute>().FirstOrDefault().Value;

使用测试 xml:

<exampleRoot>
<exampleSection name="test" value="2" />
<exampleSection name="test2" value="2" />
</exampleRoot>

根据与周围根相关的建议,我在测试程序中使用相同的 xml 结构(代表上述 xml 和 xpath 表达式的 txtbxXml 和 txtbxXpath)进行了一些“干测试”:

// 1. XDocument Trial:
((IEnumerable)XDocument.Parse(txtbxXml.Text).XPathEvaluate(txtbxXPath.Text)).Cast<XAttribute>().FirstOrDefault().Value.ToString();
// 2. XElement trial:
((IEnumerable)XElement.Parse(txtbxXml.Text).XPathEvaluate(txtbxXPath.Text)).Cast<XAttribute>().FirstOrDefault().Value.ToString();
// 3. XElement originating from other root:
((IEnumerable)(new XElement("otherRoot", XElement.Parse(txtbxXml.Text)).Element("exampleRoot")).XPathEvaluate(txtbxXPath.Text)).Cast<XAttribute>().FirstOrDefault().Value.ToString();

结果:案例 1 和案例 3 产生正确的结果,而案例 2 抛出 nullref 异常。如果案例 3 失败而案例 2 成功,这对我来说会有些意义,但现在我不明白......

最佳答案

问题是 XPath 表达式是从指定节点的子节点开始的。如果您从 XDocument 开始,根元素就是子节点。如果您从代表您的 exampleRoot 节点的 XElement 开始,那么子节点就是两个 exampleSection 节点。

如果将 XPath 表达式更改为 "/exampleSection[@name='test']/@value",它将从元素开始工作。如果您将其更改为 "//exampleSection[@name='test']/@value",它将同时适用于 XElementXDocument.

关于c# - XElement 或 XDocument 上的 XPathEvaluate 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564072/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com