Teraz się uczę, XmlDocument
ale właśnie natknąłem się na to, XDocument
a kiedy próbuję znaleźć różnicę lub korzyści z nich, nie mogę znaleźć czegoś przydatnego, czy mógłbyś mi powiedzieć, dlaczego używałbyś jednego nad drugim?
c#
xml
xmldocument
linq-to-xml
Tarik
źródło
źródło
Odpowiedzi:
Jeśli używasz .NET w wersji 3.0 lub obniżyć, to muszą korzystać
XmlDocument
aka klasycznej DOM API. Przekonasz się również, że istnieją inne interfejsy API, które będą tego oczekiwać.Jeśli jednak dostaniesz wybór, zdecydowanie polecam użycie
XDocument
aka LINQ to XML. Tworzenie dokumentów i ich przetwarzanie jest znacznie prostsze. Na przykład jest to różnica między:i
Przestrzenie nazw są dość łatwe w obsłudze w LINQ to XML, w przeciwieństwie do innych API XML, jakie kiedykolwiek widziałem:
LINQ to XML działa również bardzo dobrze z LINQ - jego model konstrukcyjny pozwala bardzo łatwo budować elementy z sekwencjami podelementów:
Wszystko jest o wiele bardziej deklaratywne, co pasuje do ogólnego stylu LINQ.
Teraz, jak wspomniał Brannon, są to interfejsy API w pamięci, a nie strumieniowe (chociaż
XStreamingElement
obsługuje leniwe wyjście).XmlReader
iXmlWriter
są normalnymi sposobami przesyłania strumieniowego XML w .NET, ale do pewnego stopnia możesz mieszać wszystkie interfejsy API. Na przykład możesz przesyłać strumieniowo duży dokument, ale używać LINQ do XML, umieszczającXmlReader
na początku elementu, czytającXElement
z niego i przetwarzając go, a następnie przechodząc do następnego elementu itp. Istnieją różne posty na blogu o tej technice, oto jeden, który znalazłem dzięki szybkiemu wyszukiwaniu .źródło
Dziwi mnie, że żadna z dotychczasowych odpowiedzi nie wspomina o tym, że
XmlDocument
nie podaje żadnych informacji o wierszu , aXDocument
robi to (przezIXmlLineInfo
interfejs).Może to być krytyczna funkcja w niektórych przypadkach (na przykład, jeśli chcesz zgłosić błędy w pliku XML lub śledzić, gdzie elementy są ogólnie zdefiniowane) i lepiej być tego świadomym, zanim z przyjemnością zaczniesz wdrażać
XmlDocument
, aby później odkryj, że musisz to wszystko zmienić.źródło
XDocument
zawiera informacje o wierszu. Zobacz XDocument.Load zeLoadOptions.SetLineInfo
jako drugi argument. Jeśli znasz sposób na uzyskanie informacji o liniiXmlDocument
, jestem ciekawy; kiedy pisałem tę odpowiedź, nie mogłem jej znaleźć. Ta druga odpowiedź wydaje się potwierdzać: stackoverflow.com/a/33622102/253883XmlDocument
jest świetny dla programistów znających model obiektowy XML DOM. Jest już od jakiegoś czasu i mniej więcej odpowiada standardowi W3C. Obsługuje ręczną nawigację, a takżeXPath
wybór węzła.XDocument
zasila funkcję LINQ to XML w .NET 3.5. To sprawia, że jest intensywnie używanyIEnumerable<>
i może być łatwiej pracować z prostym C #.Oba modele dokumentów wymagają załadowania całego dokumentu do pamięci (w przeciwieństwie
XmlReader
do na przykład).źródło
XDocument
pochodzi z interfejsu API LINQ to XML iXmlDocument
jest standardowym interfejsem API typu DOM dla XML. Jeśli dobrze znasz DOM i nie chcesz uczyć się LINQ na XML, idź zXmlDocument
. Jeśli jesteś nowy w obu przypadkach, sprawdź tę stronę, która porównuje oba, i wybierz, który Ci się bardziej podoba.Właśnie zacząłem używać LINQ na XML i uwielbiam sposób, w jaki tworzysz dokument XML przy użyciu funkcjonalnej konstrukcji. To naprawdę miłe. DOM jest nieporadny w porównaniu.
źródło
Jak wspomniano w innym miejscu, niewątpliwie Linq do Xml sprawia, że tworzenie i modyfikowanie dokumentów xml jest dziecinnie proste w porównaniu z
XmlDocument
, aXNamespace ns + "elementName"
składnia zapewnia przyjemne czytanie w przypadku przestrzeni nazw.Jedną z rzeczy, o których warto wspomnieć
xsl
i którychxpath
należy pamiętać, jest to, że nadal można wykonywać dowolnexpath 1.0
wyrażenia na Linq 2 XmlXNodes
, włączając:a następnie możemy nawigować i wyświetlać dane za
xpath
pomocą następujących metod rozszerzenia:Na przykład biorąc pod uwagę dokument Xml:
Możemy ocenić:
źródło
Należy również pamiętać, że
XDocument
jest obsługiwany w Xbox 360 i Windows Phone OS 7.0. Jeśli celujesz w nie, rozwijaj sięXDocument
lub migruj zXmlDocument
.źródło
Uważam, że to
XDocument
powoduje znacznie więcej wywołań tworzenia obiektów. Podejrzewam, że gdy będziesz przetwarzać wiele dokumentów XML,XMLDocument
będzie to szybsze.Jednym z takich przypadków jest zarządzanie skanowanymi danymi. Wiele narzędzi skanujących wysyła swoje dane w formacie XML (z oczywistych powodów). Jeśli musisz przetworzyć wiele z tych plików skanowania, myślę, że będziesz mieć lepszą wydajność
XMLDocument
.źródło