[英]C# Select Nodes not finding nodes
我確定我在這里缺少一些簡單的東西,但是我已經努力了幾天。 我希望有人能指出我所缺少的。
我從外部來源收到以下格式的XML消息:
<root>
<A>
<B xmlns="http://www.something.com/Document>
<C>Value1</C>
<D>Value2</D>
<E>Value3</E>
</B>
</A>
<A>
<B xmlns="http://www.something.com/Document>
<D>Value5</D>
<E>Value6</E>
</B>
</A>
</root>
我正在嘗試提取D元素。
我試過了:
XmlNodeList xmlResults = xdPayload.SelectNodes("//D")
這沒有返回結果。 然后以為命名空間是我嘗試的問題:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdPayload.NameTable);
xnlResults = xdPayload.SelectNodes("//D", nsmgr);
再次沒有結果。 我不認為我需要添加默認名稱空間,但是當認為智能不起作用時,請認為愚蠢。 所以我嘗試了這個:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdPayload.NameTable);
nsmgr.AddNamespace("", "http://www.something.com/Document");
xnlResults = xdPayload.SelectNodes("//D", nsmgr);
仍然沒有結果。 我嘗試使用更具描述性的XPath,例如“ / root / A / B / D”和“ /root/A/B[@xmlns="http://www.somewhere.com/Document"]/D“也沒有結果。
我不確定我在這里缺少什么。 任何幫助表示贊賞。
嘗試添加以前綴命名的名稱空間,然后將<D>
稱為ns0:D
:
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("ns0", "http://www.something.com/Document");
xnlResults = xdPayload.SelectNodes("/root/A/ns0:B/ns0:D", nsmgr);
這應該選擇<D>
元素進行進一步處理。
如果這不起作用,您將始終可以選擇忽略所有名稱空間,例如
XmlNodeList xmlResults = xdPayload.SelectNodes("//*[local-name()='D']")
使用XElement :
string text = @"
<root>
<A>
<B xmlns='http://www.something.com/Document'>
<C>Value1</C>
<D>Value2</D>
<E>Value3</E>
</B>
</A>
<A>
<B xmlns='http://www.something.com/Document'>
<D>Value5</D>
<E>Value6</E>
</B>
</A>
</root>";
XNamespace ns = "http://www.something.com/Document";
var xml = XElement.Parse(text);
var ds = xml.Descendants(ns + "D");
ds.ToList().ForEach(Console.WriteLine);
我在同一個問題上苦苦掙扎。 關鍵是Descendants()
方法。 由於您具有<root>
元素,因此在開始引用<A>
和<B>
元素之前,您已經進行了一個級別的挖掘。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.