创建过滤的XmlNodeList

时间:2013-01-11 17:06:13

标签: c# xml

我有包含图像信息的XML数据。我的第一个目标是创建一个过滤的XmlNodeList(例如,返回color == yellow所有的图像。最终目标是能够返回color == yellow的图像名称列表(返回整个过滤的XmlNodeList很棒,但我真的只需要在该过滤列表中包含一个元素,例如姓名或身份证明。

在我的例子中,根节点被称为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
    }

}

1 个答案:

答案 0 :(得分:1)

我在这里发布了一些代码:http://ideone.com/jRFoBW来演示以下技巧。无论是从流加载XML还是直接从字符串加载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");

然后,您可以执行以下操作以获取黄色idname的列表:

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);

虽然如果您想要idname黄色图片,我建议您这样做:

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
}