2012-06-27 11 views
18

XDocumentオブジェクトを特定のパス(たとえば、「/ path/to/element/I/want」)に照会したいが、続行する方法がわからない。これに似た「パス」でXDocumentをクエリするにはどうすればよいですか?

+0

[XDocumentでXPathを使う方法](http://stackoverflow.com/questions/6209841/how-to-use-xpath-with) -xdocument) –

+0

異なるパスを選択する例、名前空間の定義がある場合とない場合の例などがあります:http://stackoverflow.com/a/38272604/5838538 – Jelgab

答えて

2

soemthingはうまくいくかもしれない:

var path = "/path/to/element/I/want"; 
var route = path.Split(new []{'/'}, StringSplitOptions.RemoveEmptyEntries); 

XElement result = null; 
foreach (var node in route) 
{ 
    if (result == null) 
    { 
     result = _xmlDocument.Element(node);  
    } 
    else 
    { 
     result = result.Element(node); 
    } 
} 

return result; 
+1

'RemoveEmptyEntries'は良い考えではありません。' // 'はXPathで特定の意味を持ち、すべての子孫を検索します。 – svick

41

あなたはこれを行うにはSystem.Xml.XPath.Extensionsからメソッドを使用することができます。あなたは、単一の要素を選択したい場合は

たとえば、あなたがXPathSelectElement()を使用します。

var element = doc.XPathSelectElement("/path/to/element/I/want"); 

クエリはあなたが説明するもののような単純なパスである必要はありません、彼らはXPath言語を使用しています。

+6

4.5では、System.Xml.XPathを使用します。 – lionheart

+6

@lionheartそれはまさに私が提案したものではありませんか?また、 'System.Xml.XPath'名前空間は.Net 4.5では新しいものではありません。 – svick

4

これは多少古いポストであっても、LINQ-to-XMLXDocument

内のパスに基づいて要素を検索することがSystem.XML.XPathの代替として使用することができることに留意すべきである。

var results = x.Elements("path").Elements("to").Elements("element").Elements("I").Elements("want").FirstOrDefault(); 

注意:LINQ to XMLコマンドは、XMLの実際の構造および/またはカーディナリティに対応するために変更する必要があります。

https://msdn.microsoft.com/en-us/library/bb675156.aspx

0

私は似た何かをする必要がありました。このrepoには、XPathEvaluate()で照会するXDocumentをデモンストレーションするいくつかのユニットテストがあります。

関連する問題