2015-02-11 45 views
0

美好的一天!通过XmlDocument解析Xml属性

我尝试解析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"> 

我得到N/2个节点// config /柱。

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

谢谢!

+0

尝试'configNameNode.SelectNodes( “//配置”);' – EZI 2015-02-11 18:48:08

回答

1

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

1

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

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

我认为'[ATTRIB = ...]'应该是后面的 “配置”,而不是背后的 “列” ......? – 2015-02-11 19:34:33

+0

是的。感谢您指出这一点。我会修改它。 – Sarathy 2015-02-11 19:36:46