Ora sto imparando XmlDocument
ma mi sono appena imbattuto XDocument
e quando provo a cercare la differenza o i vantaggi di essi non riesco a trovare qualcosa di utile, potresti per favore dirmi perché dovresti usarne uno sopra l'altro?
Ora sto imparando XmlDocument
ma mi sono appena imbattuto XDocument
e quando provo a cercare la differenza o i vantaggi di essi non riesco a trovare qualcosa di utile, potresti per favore dirmi perché dovresti usarne uno sopra l'altro?
Risposte:
Se si sta utilizzando .NET versione 3.0 o inferiore, è necessario utilizzare XmlDocument
alias il classico API DOM. Allo stesso modo troverai alcune altre API che si aspettano questo.
Se hai la scelta, tuttavia, consiglierei vivamente di usare XDocument
anche LINQ to XML. È molto più semplice 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")));
Gli spazi dei nomi sono abbastanza facili da lavorare in 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 consente di creare elementi con sequenze di sottoelementi in modo molto semplice:
// 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 LINQ.
Ora, come menzionato da Brannon, si tratta di API in memoria piuttosto che di streaming (sebbene XStreamingElement
supporti l'output pigro). XmlReader
e XmlWriter
sono i normali modi di trasmettere XML in .NET, ma è possibile mescolare tutte le API in una certa misura. Ad esempio, puoi eseguire lo streaming di un documento di grandi dimensioni ma utilizzare LINQ to XML posizionando XmlReader
all'inizio di un elemento, leggendo un XElement
da esso ed elaborandolo, quindi passando all'elemento successivo ecc. Esistono vari post di blog su questa tecnica, eccone uno che ho trovato con una rapida ricerca .
Sono sorpreso che nessuna delle risposte finora menziona il fatto che XmlDocument
non fornisce informazioni sulla linea , mentre lo XDocument
fa (attraverso l' IXmlLineInfo
interfaccia).
Questa può essere una funzionalità 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) ed è meglio esserne consapevoli prima di iniziare felicemente a implementare usando XmlDocument
, per in seguito scopri che devi cambiare tutto.
XDocument
fornisce informazioni sulla linea. Vedi XDocument.Load con LoadOptions.SetLineInfo
come secondo argomento. Se conosci un modo per ottenere informazioni sulla linea con XmlDocument
sono curioso; quando ho scritto questa risposta non sono riuscito a trovarne. Questa altra risposta sembra confermare: stackoverflow.com/a/33622102/253883
XmlDocument
è ottimo per gli sviluppatori che hanno familiarità con il modello di oggetti DOM XML. È in circolazione da un po 'e più o meno corrisponde a uno standard W3C. Supporta anche la navigazione manualeXPath
selezione dei nodi.
XDocument
alimenta la funzionalità LINQ to XML in .NET 3.5. Fa un uso pesante diIEnumerable<>
e può essere più facile lavorare con C # dritto.
Entrambi i modelli di documento richiedono di caricare l'intero documento in memoria (a differenza, XmlReader
ad esempio).
Come menzionato altrove, senza dubbio, Linq to Xml rende la creazione e l'alterazione di documenti xml un gioco da ragazzi in confronto XmlDocument
eXNamespace ns + "elementName"
sintassi rende piacevole la lettura quando si tratta di spazi dei nomi.
Una cosa degna di nota xsl
e xpath
difficile da notare è che è possibile eseguire xpath 1.0
espressioni arbitrarie su Linq 2 Xml XNodes
includendo:
using System.Xml.XPath;
e quindi possiamo navigare e proiettare i dati usando xpath
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>
Siamo in grado di 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)");
XDocument
proviene dall'API LINQ to XML ed XmlDocument
è l'API stile DOM standard per XML. Se conosci bene DOM e non vuoi imparare LINQ to XML, vai con XmlDocument
. Se sei nuovo per entrambi, dai un'occhiata a questa pagina che confronta i due e scegli quale ti piace l'aspetto migliore.
Ho appena iniziato a utilizzare LINQ to XML e adoro il modo in cui crei un documento XML usando la costruzione funzionale. È davvero carino. DOM è goffo in confronto.
Credo che XDocument
faccia molte più chiamate alla creazione di oggetti. Sospetto che per quando gestisci molti documenti XML,XMLDocument
sarà più veloce.
Un punto in cui ciò accade è nella gestione dei dati di scansione. Molti strumenti di scansione producono i propri dati in XML (per ovvi motivi). Se devi elaborare molti di questi file di scansione, penso che avrai prestazioni migliori con XMLDocument
.