web-dev-qa-db-fra.com

XDocument ou XmlDocument

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?

482
Tarik

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 .

479
Jon Skeet

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.

56
Julien Guertault

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

34
Brannon

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.

23
Daniel Chambers

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

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.

14
w0land

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.

3
Buzzrick