XDocument lub XmlDocument

Uczę się teraz XmlDocument ale właśnie wpadłem na XDocument a kiedy próbuję szukać różnicy lub korzyści z nich, nie mogę znaleźć czegoś użytecznego, możesz mi powiedzieć, dlaczego używasz jednego nad drugim ?

Author: nawfal, 2009-10-09

8 answers

Jeśli używasz. NET w wersji 3.0 lub niższej, musisz użyć XmlDocument aka klasycznego API DOM. Podobnie znajdziesz kilka innych API, które będą się tego spodziewać.

Jeśli jednak masz wybór, zdecydowanie polecam użycie XDocument aka LINQ do XML. Tworzenie dokumentów i ich przetwarzanie jest znacznie prostsze. Na przykład jest to różnica między:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("root");
root.SetAttribute("name", "value");
XmlElement child = doc.CreateElement("child");
child.InnerText = "text node";
root.AppendChild(child);
doc.AppendChild(root);

I

XDocument doc = new XDocument(
    new XElement("root",
                 new XAttribute("name", "value"),
                 new XElement("child", "text node")));

Przestrzenie nazw są dość łatwe w obsłudze w LINQ do XML, w przeciwieństwie do innych API XML, jakie kiedykolwiek widziałem:

XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc

LINQ do XML działa również bardzo dobrze z LINQ - jego model konstrukcyjny pozwala na budowanie elementów z sekwencjami podelementów naprawdę łatwo:

// Customers is a List<Customer>
XElement customersElement = new XElement("customers",
    customers.Select(c => new XElement("customer",
        new XAttribute("name", c.Name),
        new XAttribute("lastSeen", c.LastOrder)
        new XElement("address",
            new XAttribute("town", c.Town),
            new XAttribute("firstline", c.Address1),
            // etc
    ));

To wszystko jest o wiele bardziej deklaratywne, co pasuje do ogólnego stylu LINQ.

Teraz, jak wspomniał Brannon, są to API w pamięci, a nie strumieniowe (chociaż XStreamingElement obsługuje leniwe wyjście). XmlReader i {[8] } są normalnymi sposobami przesyłania strumieniowego XML w. NET, ale możesz w pewnym stopniu mieszać wszystkie API. Na przykład, można przesyłać strumieniowo duży dokument, ale używać LINQ do XML, umieszczając XmlReader na początku elementu, odczytując XElement z niego i przetwarzając go, a następnie przechodząc do następnego elementu itd. Istnieją różne posty na blogu o tej technice, oto jeden znalazłem z szybkim wyszukiwaniem.

 460
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 06:43:43

Dziwi mnie, że żadna z odpowiedzi do tej pory nie wspomina o tym, że XmlDocument nie podaje informacji o linii , natomiast XDocument Czy (poprzez IXmlLineInfo interfejs).

Może to być krytyczna funkcja w niektórych przypadkach (na przykład, jeśli chcesz zgłaszać błędy w XML, lub śledzić, gdzie elementy są zdefiniowane w ogóle) i lepiej być tego świadomym, zanim szczęśliwie zaczniesz implementować za pomocą XmlDocument, aby później odkryć, że musisz to wszystko zmienić.

 51
Author: Julien Guertault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-16 03:07:10

XmlDocument jest świetny dla programistów, którzy znają model obiektowy XML DOM. Istnieje już jakiś czas i mniej więcej odpowiada standardowi W3C. Obsługuje ręczną nawigację, a także wybór węzła XPath.

XDocument obsługuje funkcję LINQ do XML w. NET 3.5. To sprawia, że ciężkie wykorzystanie IEnumerable<> i może być łatwiejsze do pracy w prostym C#.

Oba modele dokumentów wymagają załadowania całego dokumentu do pamięci (na przykład w przeciwieństwie do XmlReader).

 32
Author: Brannon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 07:17:37

XDocument jest z LINQ do XML API, a XmlDocument jest standardowym API w stylu DOM dla XML. Jeśli dobrze znasz DOM i nie chcesz uczyć się LINQ do XML, wybierz XmlDocument. Jeśli jesteś nowy w obu, sprawdź Ta strona, która porównuje te dwa, i wybierz, który z nich podoba Ci się lepiej.

Właśnie zacząłem używać LINQ do XML i uwielbiam sposób, w jaki tworzysz dokument XML przy użyciu konstrukcji funkcjonalnej. To naprawdę miłe. DOM jest niezdarny w porównaniu.

 23
Author: Daniel Chambers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 07:16:56

Jak wspomniano w innym miejscu, bez wątpienia, Linq do Xml sprawia, że tworzenie i zmiana dokumentów xml jest bardzo prosta w porównaniu do XmlDocument, a składnia XNamespace ns + "elementName" sprawia, że czytanie jest przyjemne podczas pracy z przestrzeniami nazw.

Jedną rzeczą wartą uwagi dla xsl i xpath die hards jest to, że możliwe jest nadal wykonywanie dowolnych xpath 1.0 wyrażeń na Linq 2 Xml XNodes przez włączenie:

using System.Xml.XPath;

A następnie możemy nawigować i projektować dane za pomocą xpath za pomocą tych rozszerzeń metody:

Na przykład, biorąc pod uwagę dokument Xml:

<xml>
    <foo>
        <baz id="1">10</baz>
        <bar id="2" special="1">baa baa</bar>
        <baz id="3">20</baz>
        <bar id="4" />
        <bar id="5" />
    </foo>
    <foo id="123">Text 1<moo />Text 2
    </foo>
</xml>

Możemy ocenić:

var node = xele.XPathSelectElement("/xml/foo[@id='123']");
var nodes = xele.XPathSelectElements(
"//moo/ancestor::xml/descendant::baz[@id='1']/following-sibling::bar[not(@special='1')]");
var sum = xele.XPathEvaluate("sum(//foo[not(moo)]/baz)");
 21
Author: StuartLC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 11:12:21

Należy również pamiętać, że {[0] } jest obsługiwany w Xbox 360 i Windows Phone OS 7.0. Jeśli celujesz w nie, rozwijaj dla XDocument lub migruj z XmlDocument.

 14
Author: w0land,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-28 22:08:41

Oprócz powyższego komentarza W0lands, to samo dotyczy budowania projektów Unity3D Dla Windows 8. W tym scenariuszu również musisz użyć XDocument.

 3
Author: Buzzrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-10 09:51:14

Wierzę, że XDocument sprawia, że dużo więcej wywołań tworzenia obiektów. Podejrzewam, że gdy obsługujesz wiele dokumentów XML, XMLDocument będzie szybciej.

Jednym z takich miejsc jest zarządzanie danymi skanowania. Wiele narzędzi skanujących wyprowadza swoje dane w XML (z oczywistych powodów). Jeśli musisz przetworzyć wiele z tych plików skanowania, myślę, że będziesz miał lepszą wydajność z XMLDocument.

 -8
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-28 03:52:25