0

我必须提取 XML 的一部分。我的 XML 文件可以包含数千个节点,我想只获取其中的一部分并将这部分作为 xml 字符串。

我的 XML 结构:

<ResponseMessage xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <ErrorResponse>
        <Code>SUCCESS</Code>
        <Message>Success</Message>
    </ErrorResponse>
    <OutputXml>
        <Response>
            <Product>
                <child1>xxx</child1>
                <child2>xxx</child2>
                ...
            </Product>
            <Product>
                <child1>xxx</child1>
                <child2>xxx</child2>
                ...
            </Product>
            ...
        </Response>
    </OutputXML>
</ResponseMessage>

我从这样的网络服务中获取 XML:

...
System.Net.WebResponse wResponse = req.GetResponse();
reqstream = wResponse.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(reqstream);

System.Xml.Linq.XDocument xmlResponse = System.Xml.Linq.XDocument.Parse(reader.ReadToEnd());

然后我尝试将 XML 放入通用集合中以使用 linq 处理它:

int startIndex = 0;
int nbItem = 25;
System.Text.StringBuilder outputXml = new System.Text.StringBuilder();
System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement> partialList =
   xmlResponse.Elements("Response").Skip(startIndex).Take(nbItem);

foreach (System.Xml.Linq.XElement x in partialList)
{
    outputXml.Append(x.ToString());
}

我的问题是我的列表总是空的。

4

2 回答 2

1

您可以使用以下代码来使用 LINQ To Xml:

IEnumerable<XElement> elements = xmlResponse.Root.Element("OutputXml").Element("Response").Elements("Product");

foreach(XElement element in elements)
{
    // Do Work Here
}

这会将列表过滤为仅产品,并且会在不使用索引的情况下正确选择它们。将索引与 xml 一起使用并不是最好的主意,因为 xml 可以更改。

于 2012-12-14T01:41:18.300 回答
0

您可以使用XPathEvaluate来读取子树。

如果您的列表为空,则可能是名称空间问题,因此您没有在代码中考虑此名称空间xmlns:i="http://www.w3.org/2001/XMLSchema-instance"XDocument/XElement无法自动解析命名空间。

请参阅本主题,了解如何将命名空间与 LINQ-to-XML 一起使用。

于 2012-12-14T02:07:58.727 回答