提取大XML的一部分

时间:2012-12-14 00:54:07

标签: c# xml linq

我必须提取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());
}

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

2 个答案:

答案 0 :(得分: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可以更改。

答案 1 :(得分:0)

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

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

有关如何使用LINQ-to-XML的命名空间,请参阅this topic