我有包含图像信息的XML数据。我的第一个目标是创建一个经过过滤的XmlNodeList (例如,返回其中包含color == yellow)的所有图像。最终目标是能够返回图像的名称列表,其中color == yellow (返回整个过滤的XmlNodeList很好,但我实际上只需要过滤列表中的一个元素,比如名称或id)。
在我的例子中,根节点称为Images,并且我希望能够在每个Image节点之间进行搜索。我的XML数据没有XML属性,所以每一位数据都表示为一个元素(使“黄色”成为图像的子节点,而不是图像的属性)。
XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Images xmlns="http://oec.api.opsource.net/schemas/server"
xmlns:ns9="http://oec.api.opsource.net/schemas/multigeo"
xmlns:ns5="http://oec.api.opsource.net/schemas/vip"
xmlns:ns12="http://oec.api.opsource.net/schemas/storage"
xmlns:ns6="http://oec.api.opsource.net/schemas/whitelabel"
xmlns:ns13="http://oec.api.opsource.net/schemas/manualimport"
xmlns:ns7="http://oec.api.opsource.net/schemas/datacenter"
xmlns:ns10="http://oec.api.opsource.net/schemas/reset"
xmlns:ns8="http://oec.api.opsource.net/schemas/general"
xmlns:ns11="http://oec.api.opsource.net/schemas/support"
xmlns:ns2="http://oec.api.opsource.net/schemas/directory"
xmlns:ns4="http://oec.api.opsource.net/schemas/network"
xmlns:ns3="http://oec.api.opsource.net/schemas/organization">
<Image>
<id>mcd93jf8dd</id>
<name>cat</name>
<color>yellow</color>
</Image>
<Image>
<id>d4b8l23sas</id>
<name>dog</name>
<color>yellow</color>
</Image>
</Images>我最初的XML数据源是一个流。我已经找到了使用foreach循环遍历XML层次结构的不同级别的方法,但是我总是遇到在子节点上没有我需要的所有方法的问题。其他地方的建议似乎建议使用XPath来实现我的过滤器,但我无法使用到目前为止我所获得的:
C#
//'stream' previously defined as a Stream
XmlReader reader = XmlReader.Create(stream);
XmlDocument xml = new XmlDocument();
xml.Load(reader);
XmlElement root = xml.DocumentElement;
XmlNodeList images = root.ChildNodes;
foreach (XmlNode image in images) {
XmlNodeList attributes = image.ChildNodes;
foreach (XmlNode attribute in attributes) {
//do stuff
}
}发布于 2013-01-12 01:11:25
我在这里发布了一些代码:http://ideone.com/jRFoBW来演示以下技术。XML是从流中加载还是直接从字符串中加载应该没有区别,但我已经将其设置为从流中加载,以尽可能接近您的条件。
由于XML使用名称空间,因此需要创建一个名称空间管理器并将名称空间添加到其中:
XmlNamespaceManager nsm = new XmlNamespaceManager(xml.NameTable);
// The prefix can be anything as long as you use it consistently
nsm.AddNamespace("i", "http://oec.api.opsource.net/schemas/server");然后,您可以执行以下操作来获取黄色id和name的列表:
XmlNodeList ids = xml.SelectNodes("/i:Images/i:Image[i:color = 'yellow']/i:id", nsm);
XmlNodeList names = xml.SelectNodes("/i:Images/i:Image[i:color = 'yellow']/i:name", nsm);不过,如果您想同时为黄色图像使用id和name,我建议您这样做:
foreach(XmlNode yellowImage in xml.SelectNodes("/i:Images/i:Image[i:color = 'yellow']", nsm))
{
string id = yellowImage.SelectSingleNode("i:id", nsm).InnerText;
string name = yellowImage.SelectSingleNode("i:name", nsm).InnerText;
// use id and name
}https://stackoverflow.com/questions/14283105
复制相似问题