2011-11-08 281 views
0

我有很多這樣的文件節點的大型XML文件:選擇XML節點?

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

在我的C#程序中,我要選擇一個特定的文件名,例如,在上面的例子中的一個節點,我想選擇FileName爲logfile1.log的文件節點。有沒有一種方法,我可以在我的C#這樣做,也許我需要做的文件名作爲每個文件節點的屬性,例如:

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

可能有人建議我在最好的做法嗎?謝謝你的幫助!

回答

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()))的調用應該換出來以適應您自己的應用程序。

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"); 
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']"); 

或者,如果有可能不止一個,你可以使用選擇找到多個匹配,然後重複它們。

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