从c#中的xml元素中获取值

时间:2015-05-18 19:02:00

标签: c# xml linq-to-xml

我试图从下面的xml字符串中获取Absoluteentry标记的值,但是它显示的objectrefrence没有设置异常

<?xml version="1.0" ?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
  <env:Body>
    <AddResponse xmlns="http://www.sap.com/SBO/DIS">
      <PickListParams>
        <Absoluteentry>120072</Absoluteentry> 
      </PickListParams>
    </AddResponse>
  </env:Body>
</env:Envelope>

代码

XDocument doc = XDocument.Parse(xmlstring);
doc.Element("Envelope").Element("Body").Element("AddResponse").Element("PickListParams").Element("Absoluteentry").Value;

2 个答案:

答案 0 :(得分:5)

查看XML:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
...

这是带有URI Envelope的命名空间中的"http://www.w3.org/2003/05/soap-envelope"元素。

现在看看你的代码:

doc.Element("Envelope")...

那里正在寻找一个不在任何命名空间中的Envelope元素。您应该指定命名空间 - 以及您正在寻找的其他元素的命名空间:

XNamespace env = "http://www.w3.org/2003/05/soap-envelope";
XNamespace responseNs = "http://www.sap.com/SBO/DIS";
XDocument doc = XDocument.Parse(xmlstring);
var result = doc.Element(env + "Envelope")
    .Element(env + "Body")
    .Element(responseNs + "AddResponse")
    .Element(responseNs + "PickListParams")
    .Element(responseNs + "Absoluteentry").Value;

答案 1 :(得分:0)

您也可以使用DescendantsDescendants找到任何级别的孩子。

var result = doc.Element(env + "Envelope")
    .Element(env + "Body")
    .Descendants(responseNs + "Absoluteentry").Value;