选择XML节点?

时间:2011-11-08 17:02:49

标签: c# .net xml

我有一个包含大量这些文件节点的大型XML文件:

<File>
  <Component>Main</Component>
  <Path>C:\Logs\Main</Path>
  <FileName>logfile1.log</FileName>
</File>

在我的C#程序中,我想选择一个具有特定文件名的节点,例如在上面的示例中,我想选择FileName为logfile1.log的File节点。有没有办法在C#中执行此操作,或者我需要将FileName作为每个File节点的属性,例如:

<File name="logfile1.log">...</File>

有人可以告诉我这里的最佳做法吗?谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

var doc = new XmlDocument();
doc.LoadXml(xml); // or Load(path)
var node = doc.SelectSingleNode("//File/FileName[.='logfile1.log']");

(见XPath selection by innertext

var doc = XDocument.Load(path);
var node = doc.Elements("Path").FirstOrDefault(e => (string)e.Element("FileName") == "logfile1.log");

答案 1 :(得分:2)

XPath查询将是一个不错的选择。您可以使用xpath搜索元素名称或属性名称。

类似的东西:

var doc = new XPathDocument(path);
var xpath = doc.CreateNavigator();

//with element
var node = xpath.SelectSingleNode("//File[FileName='logfile1.log']");

//or with attribute
var node = xpath.SelectSingleNode("//File[@name='logfile1.log']");

或者,如果有多个匹配可以使用Select来查找多个匹配,然后迭代它们。

var node = xpath.Select("//File...");

答案 2 :(得分:2)

使用查询语法;

var xml = XDocument.Load("input.xml");
var node = (from file in xml.Descendants("File")
           where (string)file.Element("FileName") == "logfile1.log"
           select file).Single();

显然强制查询的调用(本例中为Single())应该换出以适合您自己的应用。