如何从以下XML获取Status元素?

时间:2011-10-14 16:26:41

标签: c# xml

我从Web服务中获取了以下xml块:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfItemResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <ItemResponse>
        <Item xmlns="http://www.xyz.com/ns/2006/05/01/webservices/abc/def">
            <RequestKey Name="ESM.PA" Service="" />
            <QoS>
                <TimelinessInfo Timeliness="REALTIME" TimeInfo="0" />
                <RateInfo Rate="TIME_CONFLATED" TimeInfo="10" />
            </QoS>
            <Status>
                <StatusMsg>OK</StatusMsg>
                <StatusCode>0</StatusCode>
            </Status>
            <Fields>
                <Field DataType="Utf8String" Name="DSPLY_NAME">
                    <Utf8String>D15 |ASDFDSAA ETF </Utf8String>
                </Field>
            </Fields>
        </Item>
    </ItemResponse>
</ArrayOfItemResponse>

我尝试按如下方式捕获对象中的Status元素,但它无效。

var _xml = XDocument.Parse(xmlFromService);
var stat = _xml
    .Descendants("ArrayOfItemResponse")
    .Descendants("ItemResponse")
    .Descendants("Item")
    .Descendants("Status");

对我来说,获得此元素的最佳途径是什么?

5 个答案:

答案 0 :(得分:1)

如果要使用System.Xml.Linq,可以使用以下表达式:

var stat = (from n in _xml.Descendants() where n.Name.LocalName == "Status" select n).ToList();

答案 1 :(得分:1)

由于Item

中的xmlns属性,您无法使用现有代码获得所需的结果
 <Item xmlns="http://www.xyz.com/ns/2006/05/01/webservices/abc/def">

This问题解决了您实际面临的问题。如果您不知道命名空间,那么您应该查看this问题。

答案 2 :(得分:0)

我不知道最好的方法,但你可以像这样阅读

XmlDocument xdoc = new XmlDocument();
xdoc.Load(stream);
var statMsg = xdoc.GetElementsByTagName("StatusMsg")[0].InnerText;
var statCode = xdoc.GetElementsByTagName("StatusCode")[0].InnerText;

答案 3 :(得分:0)

使用xpath,类似于 var stat = _xml.SelectSingleNode(@"ArrayOfItemResponse/ItemResponse/ItemStatus/StatusCode").Value;

应该将值0放入stat。

答案 4 :(得分:0)

您的xml代码使用命名空间。

XNamespace  ns = "http://www.xyz.com/ns/2006/05/01/webservices/abc/def";
var stat = _xml.Descendants(ns + "Status");