繁体   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