通过XmlDocument解析Xml属性

时间:2015-02-11 18:45:14

标签: c# xml xmldocument

美好的一天!

我尝试解析Xml文档:

结构:

<root>
  <SelectedConfig name="configuration1"/>
    <config name="configuration1">
     <Column Id="0"  name="111"/>
  ...
 </root>

我试着像这样解析它:

 XmlNode configNameNode = _doc.SelectSingleNode("//SelectedConfig");

        if (configNameNode != null)
        {
            string configName = configNameNode.Attributes["name"].Value; 

            var config = _doc.SelectNodes("//config");

            XmlNodeList columnNodes = _doc.SelectNodes("//config/Column");

            foreach (XmlNode node in columnNodes)
            {
                var id = node.Attributes["Id"].Value;
                var name = node.Attributes["name"].Value;

                Tuple<string, String> numberOfColumnToColumnName = new Tuple<string, string>(id, name);
                numberOfColumnToColumnNameTupleColl.Add(numberOfColumnToColumnName);

            }
        }

但是,如果我添加:

<config name="configuration2">

我得到// config / column的N * 2个节点。

如何从配置1或2中仅选择一组xml节点?

谢谢!

2 个答案:

答案 0 :(得分:1)

您有多个节点&#34; config&#34;,每个节点都有多个子节点&#34;列&#34;。
由于所有这些节点具有相同的名称且仅在属性上有所不同,因此函数XmlNodeList columnNodes = _doc.SelectNodes("//config/Column");将收集所有&#34;列&#34;所有&#34; config&#34; s的节点 解决方案1:将配置节点重命名为config_xxx,例如config_configuration1。但我认为这不是你想要的 解决方案2:config = _doc.SelectNodes("//config");已经为您提供了一个节点列表。在列表上运行for each cfgEntry in config,在每个节点上调用cfgEntry.SelectNodes("column")。然后,您将只获得该单个配置节点的列节点。

答案 1 :(得分:1)

如果您尝试获取所选配置,可以尝试以下代码。

string xPath = string.format("//config[@name='{0}']/Column", configName);
var config = _doc.SelectNodes(xPath);