2011-11-08 10 views
0

私はこれらのファイルノードの多くの大規模なXMLファイルを持っている:私は選択したい上記の例では例えば、私は特定のファイル名を持つノードを選択したい私のC#プログラムでXMLノードを選択していますか?

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

を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...");