簡體   English   中英

使用linq-xml深入查詢xElement

[英]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 queryitem已正確設置,但我在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.

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