2015-02-11 47 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