[英]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.