[英]query deep into xElement using linq-xml
我有XML
<Envelopes>
<Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<Body>
<UpdateObjectResponse xmlns="http://www.sap.com/SBO/DIS"
CommandID="UpdateObject picklist">
<RetKey>426358</RetKey>
<RetType>156</RetType>
</UpdateObjectResponse>
</Body>
</Envelope>
<Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<Body>
<UpdateObjectResponse xmlns="http://www.sap.com/SBO/DIS"
CommandID="UpdateObject picklist">
<RetKey>426358</RetKey>
<RetType>156</RetType>
</UpdateObjectResponse>
</Body>
</Envelope>
</Envelopes>
我試圖像這樣獲取RetKey
元素的值
var query = from t in xdoc.Descendants("Envelope") select t;
foreach (XElement item in query)
{
var k = item.Element("Body").Element("UpdateObjectResponse").Element("RetKey").Value;
}
var query
和item
已正確設置,但我在foreach
循環中收到此錯誤
“你調用的對象是空的。”
我看不到任何明顯的代碼錯誤。
我假設您使用的是VS? 嘗試在foreach的每一行中運行帶有斷點的以下代碼,並在每一步檢查本地變量,以查看可能是哪個.Element(..)查詢。 在每個步驟中,請在locals視圖中檢查每個變量,以查看是否有意外情況出現在XElement之一中。
var query = from t in xdoc.Descendants("Envelope") select t;
foreach (XElement item in query)
{
var j = item;
var k = item.Element("Body");
var l = k.Element("UpdateObjectResponse");
var m = l.Element("RetKey");
var n = m.Value;
}
您可能會看到jklmn中的哪個變量與預期的不同,或者代碼將以更多信息性異常中斷。
注意:至少在VS2015中,locals視圖中有一個放大鏡,可讓您很好地查看XML(以防萬一)。
編輯 :我不知道XElement.Descendants和XElement.Elements之間的區別 ,我仍然不清楚如何正確地使用級聯名稱空間。 請參閱不使用或僅使用根名稱空間 。 如果名稱空間不固定,請參見從Elements中剝離名稱空間。
我認為這可能是解決方案。 如果我沒弄錯,你可以寫
XNamespace ns = "http://www.sap.com/SBO/DIS";
var klist = from t in xdoc.Descendants(ns + "RetKey") select t.Value;
獲取該xml中RetKey值的列表。 也許還嘗試使用xdoc.Root.Descendants來避免第一個名稱空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.