XML选择节点并循环通过它

时间:2014-07-21 01:24:16

标签: c# xml

我在循环XML节点时遇到了一些问题。

首先,这是XML文件的一般格式:

<Config>
  <Facilities>
    <Facility>
      <ID>1</ID>
      <Name>Facility Name</Name>
      <Profiles>
        <Profile>
            <Name>Value</Name>
            <Item2>Value</2>
        </Profile>
        <Profile>
            <Name>Another Value</Name>
        </Profile>
      </Profiles>
    </Facility>
    <Facility>
      <ID>2</ID>
      <Name>Facility Name</Name>
      <Profiles>
        <Profile>
            <Name>Value</Name>
        </Profile>
      </Profiles>
    </Facility>
  </Facilities>
</Config>

以下是我使用的代码:

XmlDocument configFile = new XmlDocument();
configFile.Load(CONFIG_FILE);

XmlNodeList nodeList = configFile.SelectNodes("/Config/Facilities/Facility[ID[text()='" + facilityID + "']]/Profiles/Profile");
foreach (XmlNode no in nodeList)
{
    Console.WriteLine(no["Name"].InnerText);
    //myList.Items.Add(no["Name"].InnerText);
}

基本上,我想遍历设施并选择具有特定ID的设施(此ID来自我之前在我的代码中设置的facilityID ...是的我已经检查过了,它设置正确)。然后,我想查看与设施相关的配置文件并循环浏览它们。我希望能够在适用的每个<Profile>中使用所有元素。

但是,当我执行此代码时,它不会在调试控制台中返回任何内容。

2 个答案:

答案 0 :(得分:2)

你的意思是这样的?当然,这是使用XElement类。我倾向于喜欢它,因为它更容易调试,至少对我来说,更容易部署。

var root = XElement.Load(CONFIG_FILE).Element("Facilities");

var facility = root.Elements("Facility").FirstOrDefault(c => c.Element("ID").Value == facilityID.ToString());

return facility.Element("Profiles").Elements("Profile");

它没有任何错误处理,但您可以根据需要添加它。

我不知道你是否想要这样做,这取决于你将如何使用它,但你也可以用它替换最后一行:

return facility.Element("Profiles").Elements("Profile").Select(c => c.Element("Name").Value);

这会给你一些名字。同样,取决于你究竟在寻找什么。我刚刚添加了这个,因为我看到你的例子只是打印出名字。

答案 1 :(得分:2)

我不确定您的文件中是否存在此内容,但发布的示例中似乎存在XML错误。

<Item2>Value</2>

如果删除它,我就能正确看到预期的值。例如,如果我使用&#34; 1&#34;对于facilityID,我收到了

Value
Another Value