我有一个包含大量这些文件节点的大型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>
有人可以告诉我这里的最佳做法吗?谢谢你的帮助!
答案 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())应该换出以适合您自己的应用。