Ich habe ein XDocument
Objekt. Ich möchte mit LINQ in jeder Tiefe nach Elementen mit einem bestimmten Namen suchen. Wenn ich benutze Descendants("element_name")
, bekomme ich nur Elemente, die direkte Kinder der aktuellen Ebene sind. Was ich suche, ist das Äquivalent von "// element_name" in XPath ... sollte ich nur verwenden XPath
, oder gibt es eine Möglichkeit, dies mit LINQ-Methoden zu tun? Vielen Dank.
143
doc.Descendants("Cars").Descendants("Part")
(oder möglicherweise,.Elements("Part")
wenn sie nur direkte Kinder waren.var foo = new XDocument().Descendants("Bar").Descendants("Baz");
WeilDescendants
ein leeres zurückgibtIEnumerable<XElement>
und nichtnull
.Ein Beispiel für den Namespace:
quelle
Sie können es so machen:
wo
xml
ist einXDocument
.Beachten Sie, dass die Eigenschaft
Name
ein Objekt mit aLocalName
und a zurückgibtNamespace
. Deshalb müssen Sie verwenden,Name.LocalName
wenn Sie nach Namen vergleichen möchten.quelle
Nachkommen tun genau das, was Sie brauchen, aber stellen Sie sicher, dass Sie einen Namespace-Namen zusammen mit dem Namen des Elements angegeben haben. Wenn Sie es weglassen, erhalten Sie wahrscheinlich eine leere Liste.
quelle
Es gibt zwei Möglichkeiten, dies zu erreichen:
Das Folgende sind Beispiele für die Verwendung dieser Ansätze:
Wenn Sie XPath verwenden, müssen Sie einige Manipulationen mit IEnumerable durchführen:
Beachten Sie, dass
ergibt entweder einen Nullzeiger oder keine Ergebnisse.
quelle
XPathEvaluate
das imSystem.Xml.XPath
Namespace ist.Ich verwende eine
XPathSelectElements
Erweiterungsmethode, die genauso funktioniert wie dieXmlDocument.SelectNodes
Methode:quelle
Nach der Antwort von @Francisco Goldenstein habe ich eine Erweiterungsmethode geschrieben
quelle
Wir wissen, dass das oben Genannte wahr ist. Jon liegt niemals falsch; reale Wünsche können ein wenig weiter gehen
Beispiel: Normalerweise besteht das Problem darin, wie wir EchoToken im obigen XML-Dokument erhalten können. Oder wie man das Element mit dem Namen attrbute verwischt.
1- Sie können sie finden, indem Sie mit dem Namespace und dem Namen wie unten darauf zugreifen
2- Sie finden es am Attributinhaltswert wie diesem
quelle
Dies ist meine Variante der Lösung basierend auf
Linq
und Descendants Methode derXDocument
KlasseErgebnisse:
Weitere Details zur
Desendants
Methode finden Sie hier.quelle
(Code und Anweisungen gelten für C # und müssen möglicherweise für andere Sprachen geringfügig geändert werden.)
Dieses Beispiel funktioniert perfekt, wenn Sie von einem übergeordneten Knoten mit vielen untergeordneten Knoten lesen möchten. Sehen Sie sich beispielsweise das folgende XML an.
Mit diesem Code unten (unter Berücksichtigung der Tatsache, dass die XML-Datei in Ressourcen gespeichert ist (Hilfe zu Ressourcen finden Sie unter den Links am Ende des Snippets)) können Sie jede E-Mail-Adresse innerhalb des Tags "E-Mails" abrufen.
Ergebnisse
Hinweis: Für Konsolenanwendungen und WPF- oder Windows Forms müssen Sie "using System.Xml.Linq;" hinzufügen. Wenn Sie die Direktive oben in Ihrem Projekt verwenden, müssen Sie für Console auch einen Verweis auf diesen Namespace hinzufügen, bevor Sie die Direktive Using hinzufügen. Auch für die Konsole befindet sich standardmäßig keine Ressourcendatei unter dem Ordner "Eigenschaften", sodass Sie die Ressourcendatei manuell hinzufügen müssen. In den folgenden MSDN-Artikeln wird dies ausführlich erläutert.
Hinzufügen und Bearbeiten von Ressourcen
Gewusst wie: Hinzufügen oder Entfernen von Ressourcen
quelle