簡體   English   中英

XElement或XDocument上的XPathEvaluate之間的區別?

[英]Difference between XPathEvaluate on XElement or XDocument?

在C#程序的某個地方,我需要從xml結構中獲取屬性值。 我可以直接作為XElement到達這個xml結構,並有一個簡單的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結構(txtbxXml和txtbxXpath表示上面描述的xml和xpath表達式):

// 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 exampleRoot ,則子節點是兩個exampleSection節點。

如果將XPath表達式更改為"/exampleSection[@name='test']/@value" ,它將從元素開始工作。 如果將其更改為"//exampleSection[@name='test']/@value" ,它將同時適用於XElementXDocument

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM