Mam XDocument
przedmiot. Chcę wyszukiwać elementy o określonej nazwie na dowolnej głębokości przy użyciu LINQ. Kiedy używam Descendants("element_name")
, otrzymuję tylko elementy, które są bezpośrednimi elementami podrzędnymi bieżącego poziomu. To, czego szukam, to odpowiednik „// nazwa_elementu” w XPath ... powinienem po prostu użyć XPath
, czy jest sposób, aby to zrobić za pomocą metod LINQ? Dzięki.
143
doc.Descendants("Cars").Descendants("Part")
(lub prawdopodobnie.Elements("Part")
gdyby były tylko bezpośrednimi dziećmi.var foo = new XDocument().Descendants("Bar").Descendants("Baz");
ponieważDescendants
zwraca wartość pustąIEnumerable<XElement>
i nienull
.Przykład wskazujący przestrzeń nazw:
źródło
Możesz to zrobić w ten sposób:
gdzie
xml
jestXDocument
.Należy pamiętać, że właściwość
Name
zwraca obiekt, który ma aLocalName
iNamespace
. Dlatego musisz użyć,Name.LocalName
jeśli chcesz porównać według nazwy.źródło
Potomkowie zrobią dokładnie to, czego potrzebujesz, ale upewnij się, że dołączyłeś nazwę przestrzeni nazw wraz z nazwą elementu. Jeśli go pominiesz, prawdopodobnie otrzymasz pustą listę.
źródło
Można to osiągnąć na dwa sposoby:
Poniżej znajdują się przykłady stosowania tych podejść,
Jeśli używasz XPath, musisz dokonać pewnych manipulacji z IEnumerable:
Zwróć na to uwagę
daje pusty wskaźnik lub brak wyników.
źródło
XPathEvaluate
jest wSystem.Xml.XPath
przestrzeni nazw.Używam
XPathSelectElements
metody rozszerzenia, która działa w taki sam sposób, jakXmlDocument.SelectNodes
metoda:źródło
Po odpowiedzi @Francisco Goldenstein napisałem metodę rozszerzenia
źródło
wiemy, że powyższe jest prawdą. Jon nigdy się nie myli; pragnienia z życia wzięte mogą pójść trochę dalej
Na przykład, zwykle problem polega na tym, w jaki sposób możemy uzyskać EchoToken w powyższym dokumencie xml? Albo jak rozmyć element z nazwą attrbute.
1- Możesz je znaleźć, korzystając z przestrzeni nazw i nazwy, jak poniżej
2- Możesz go znaleźć po wartości zawartości atrybutu, takiej jak ta
źródło
To mój wariant rozwiązania oparty na
Linq
metodzie DescendantsXDocument
klasyWyniki:
Więcej informacji na temat
Desendants
metody można znaleźć tutaj.źródło
(Kod i instrukcje są przeznaczone dla języka C # i mogą wymagać nieznacznej zmiany w przypadku innych języków)
Ten przykład działa doskonale, jeśli chcesz czytać z węzła nadrzędnego, który ma wiele dzieci, na przykład spójrz na następujący kod XML;
Teraz z poniższym kodem (pamiętaj, że plik XML jest przechowywany w zasobach (zobacz linki na końcu fragmentu, aby uzyskać pomoc dotyczącą zasobów). Możesz uzyskać każdy adres e-mail w tagu „e-maile”.
Wyniki
Uwaga: w przypadku aplikacji konsoli i formularzy WPF lub Windows należy dodać „using System.Xml.Linq;” Używając dyrektywy u góry projektu, w przypadku konsoli musisz również dodać odwołanie do tej przestrzeni nazw przed dodaniem dyrektywy Using. Również w przypadku konsoli nie będzie domyślnie żadnego pliku zasobów w folderze „Właściwości”, więc musisz ręcznie dodać plik zasobów. Poniższe artykuły MSDN wyjaśniają to szczegółowo.
Dodawanie i edycja zasobów
Instrukcje: dodawanie lub usuwanie zasobów
źródło