我必须提取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());
}
我的问题是我的列表总是空的。
答案 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。