2012-06-27 4 views
18

Ich möchte ein XDocument Objekt für einen bestimmten Pfad abfragen (z. B. "/ Pfad/zu/Element/ich/wollen"), aber ich weiß nicht weiter.Wie kann ich ein XDocument mit einem 'Pfad' abfragen?

+0

mögliche Duplikat von [wie XPath mit XDocument zu verwenden?] (Http://stackoverflow.com/questions/6209841/how-to-use-xpath-with -xdocument) –

+0

Sie können ein Beispiel sehen, indem Sie hier verschiedene Pfade mit/ohne Namensraumdefinitionen usw. auswählen: http://stackoverflow.com/a/38272604/5838538. – Jelgab

Antwort

2

soemthing ähnlich wie dies funktionieren könnte:

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' ist keine gute Idee,' // 'hat in XPath eine spezielle Bedeutung und es wird nach allen Nachkommen gesucht. – svick

41

Sie Methoden von System.Xml.XPath.Extensions verwenden können, dies zu tun.

Zum Beispiel, wenn Sie ein einzelnes Element auswählen möchten, würden Sie XPathSelectElement() verwenden:

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

Die Abfragen sein müssen keine einfache Wege wie das, was Sie beschrieben, verwenden sie die XPath Sprache.

+6

In 4.5 verwenden Sie System.Xml.XPath. – lionheart

+6

@lionheart Ist das nicht genau das, was ich vorgeschlagen habe? Und der 'System.Xml.XPath'-Namespace ist sicherlich nicht neu in .Net 4.5. – svick

4

Auch wenn dies ein etwas älterer Beitrag, sei darauf hingewiesen, dass LINQ-to-XML kann als Alternative zu System.XML.XPath verwendet werden, um Elemente auf einem Weg in einem XDocument

Beispiel basieren zu finden:

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

Hinweis: Der LINQ to XML-Befehl muss möglicherweise geändert werden, um die tatsächliche Struktur und/oder Kardinalität des XML zu berücksichtigen.

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

0

Ich brauchte etwas Ähnliches zu tun. Diese repo hat mehrere Komponententests Demo XDocument Abfrage mit XPathEvaluate()