我在循环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>
中使用所有元素。
但是,当我执行此代码时,它不会在调试控制台中返回任何内容。
答案 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