it-swarm.dev

XDocument o XmlDocument

Ora sto imparando XmlDocument ma mi sono appena imbattuto in XDocument e quando cerco di cercare la differenza o i benefici di loro non riesco a trovare qualcosa di utile, potresti dirmi perché ne useresti uno su un altro?

478
Tarik

Se stai usando .NET versione 3.0 o precedente, tu hai per usare XmlDocument aka la classica API DOM. Allo stesso modo, scoprirai che ci sono altre API che si aspettano questo.

Se si ottiene la scelta, tuttavia, consiglio vivamente di utilizzare XDocument aka LINQ to XML. È molto più semplice per creare documenti ed elaborarli. Ad esempio, è la differenza tra:

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);

e

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

I Namespace sono abbastanza facili da utilizzare con LINQ to XML, a differenza di qualsiasi altra API XML che abbia mai visto:

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

LINQ to XML funziona anche molto bene con LINQ: il suo modello di costruzione ti consente di creare elementi con sequenze di sottoelementi molto facilmente:

// 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
    ));

È tutto molto più dichiarativo, che si adatta allo stile generale di LINQ.

Ora, come menzionato Brannon, si tratta di API in-memory piuttosto che di streaming (sebbene XStreamingElement supporti l'output pigro). XmlReader e XmlWriter sono i modi normali di streaming XML in .NET, ma è possibile unire tutte le API in una certa misura. Ad esempio, è possibile eseguire lo streaming di un documento di grandi dimensioni, ma utilizzare LINQ su XML posizionando un XmlReader all'inizio di un elemento, leggendo un XElement da esso ed elaborandolo, quindi passando all'elemento successivo ecc. Ci sono vari post di blog su questo tecnica, eccone una che ho trovato con una ricerca rapida .

474
Jon Skeet

Sono sorpreso che nessuna delle risposte finora menziona il fatto che XmlDocument non fornisce informazioni sulla linea , mentre XDocument fa (attraverso il IXmlLineInfo interfaccia).

Questa può essere una caratteristica critica in alcuni casi (ad esempio se si desidera segnalare errori in un XML o tenere traccia di dove gli elementi sono definiti in generale) e si dovrebbe essere consapevoli di questo prima di iniziare felicemente a implementare usando XmlDocument, per più tardi scopri che devi cambiare tutto.

53
Julien Guertault

XmlDocumentè ottimo per gli sviluppatori che hanno familiarità con il modello di oggetti DOM XML. È in circolazione da un po 'e corrisponde più o meno a uno standard W3C. Supporta la navigazione manuale e la selezione del nodo XPathname__.

XDocumentalimenta la funzionalità LINQ to XML in .NET 3.5. Fa un uso pesante di IEnumerable<> e può essere più facile lavorare con C # dritto.

Entrambi i modelli di documento richiedono di caricare l'intero documento in memoria (a differenza di XmlReaderper esempio).

34
Brannon

XDocument è dall'API LINQ a XML e XmlDocument è l'API standard in stile DOM per XML. Se conosci bene DOM, e non vuoi imparare LINQ in XML, vai con XmlDocument. Se sei nuovo ad entrambi, controlla questa pagina che confronta i due e scegli quale ti piace di più.

Ho appena iniziato a utilizzare LINQ in XML e mi piace il modo in cui crei un documento XML utilizzando la costruzione funzionale. È davvero carino. DOM è goffo in confronto.

23
Daniel Chambers

Come accennato altrove, indubbiamente, Linq to Xml rende la creazione e l'alterazione dei documenti xml un gioco da ragazzi rispetto a XmlDocument, e la sintassi XNamespace ns + "elementName" rende piacevole la lettura quando si tratta di namespace.

Una cosa degna di nota per xsl e xpath die hards da notare è che IS possibile eseguire ancora espressioni xpath 1.0 su Linq 2 Xml XNodes includendo:

using System.Xml.XPath;

e quindi possiamo navigare e proiettare i dati usando xpath tramite questi metodi di estensione:

Ad esempio, dato il documento 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>

Possiamo valutare:

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)");
22
StuartLC

Inoltre, si noti che XDocument è supportato in Xbox 360 e Windows Phone OS 7.0. Se li bersagli, sviluppi per XDocument o esegui la migrazione da XmlDocument.

14
w0land

oltre al commento di W0lands sopra, lo stesso vale per la costruzione di progetti Unity3D per Windows 8. In questo scenario è necessario utilizzare XDocument.

3
Buzzrick