Je suis en train d'apprendre XmlDocument
mais je viens de tomber sur XDocument
et lorsque j'essaie de rechercher la différence ou les avantages qui en découlent, je ne trouve pas quelque chose d'utile, pourriez-vous me dire pourquoi vous en utiliseriez une par une?
Si vous utilisez .NET version 3.0 ou antérieure, vous devez utiliser XmlDocument
, autrement dit l'API DOM classique. De même, vous constaterez qu'il existe d'autres API qui s'y attendront.
Si vous avez le choix, cependant, je vous recommanderais vivement d'utiliser XDocument
aka LINQ to XML. C'est beaucoup plus simple de créer des documents et de les traiter. Par exemple, c'est la différence entre:
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);
et
XDocument doc = new XDocument(
new XElement("root",
new XAttribute("name", "value"),
new XElement("child", "text node")));
Les espaces de noms sont assez faciles à utiliser dans LINQ to XML, contrairement à toute autre API XML que j'ai jamais vue:
XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc
LINQ to XML fonctionne également très bien avec LINQ - son modèle de construction vous permet de construire des éléments avec des séquences de sous-éléments très facilement:
// 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
));
Tout cela est beaucoup plus déclaratif, ce qui correspond au style général LINQ.
Comme l'a mentionné Brannon, ce sont des API en mémoire plutôt que des API en streaming (bien que XStreamingElement
prenne en charge les sorties différées). XmlReader
et XmlWriter
sont les méthodes habituelles de diffusion de données XML en .NET, mais vous pouvez mélanger toutes les API dans une certaine mesure. Par exemple, vous pouvez diffuser un document volumineux mais utiliser LINQ to XML en positionnant un XmlReader
au début d'un élément, en lisant un XElement
et en le traitant, puis en passant à l'élément suivant, etc. Il existe plusieurs articles de blog sur cette technique, voici un que j'ai trouvé avec une recherche rapide .
Je suis surpris qu'aucune des réponses à ce jour ne mentionne le fait que XmlDocument
ne fournit aucune information de ligne , tandis que XDocument
fait (par le biais du - IXmlLineInfo
interface).
Cela peut être une fonctionnalité essentielle dans certains cas (par exemple, si vous souhaitez signaler des erreurs dans un fichier XML ou garder la trace des éléments définis en général) et vous devez en être conscient avant de commencer à implémenter avec bonheur avec XmlDocument
, découvrir plus tard que vous devez tout changer.
XmlDocument
est idéal pour les développeurs familiarisés avec le modèle d'objet XML DOM. Il existe depuis un certain temps et correspond plus ou moins à une norme W3C. Il prend en charge la navigation manuelle ainsi que la sélection de nœuds XPath
.
XDocument
active la fonctionnalité LINQ to XML dans .NET 3.5. Il fait un usage intensif de IEnumerable<>
et peut être plus facile à utiliser en C # simple.
Les deux modèles de document nécessitent le chargement de la totalité du document en mémoire (à la différence de XmlReader
par exemple).
XDocument
provient de l'API LINQ to XML et XmlDocument
est l'API standard de style DOM pour XML. Si vous connaissez bien DOM et que vous ne voulez pas apprendre LINQ to XML, utilisez XmlDocument
. Si vous êtes nouveau dans les deux, consultez cette page qui compare les deux et choisissez celle qui vous convient le mieux.
Je viens tout juste de commencer à utiliser LINQ to XML et j'adore la façon dont vous créez un document XML à l'aide d'une construction fonctionnelle. C'est vraiment sympa. DOM est maladroit en comparaison.
Comme mentionné ailleurs, Linq to Xml facilite sans aucun doute la création et la modification de documents xml par rapport à XmlDocument
, et la syntaxe XNamespace ns + "elementName"
permet une lecture agréable lors de l'utilisation d'espaces de nommage.
Il est intéressant de noter que xsl
et xpath
sont difficiles à noter, c’est que IS peut toujours exécuter des expressions xpath 1.0
arbitraires sur Linq 2 Xml XNodes
en incluant:
using System.Xml.XPath;
et ensuite nous pouvons naviguer et projeter des données en utilisant xpath
via ces méthodes d'extension:
Par exemple, étant donné le document 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>
Nous pouvons évaluer:
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)");
Notez également que XDocument
est pris en charge par la Xbox 360 et le Windows Phone OS 7.0. Si vous les ciblez, développez pour XDocument
ou migrez de XmlDocument
.
en plus du commentaire W0lands ci-dessus, il en va de même lors de la construction de projets Unity3D pour Windows 8. Vous devez également utiliser XDocument dans ce scénario.