美好的一天!
我尝试解析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节点?
谢谢!
答案 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);