Question XDocument ou XmlDocument


J'apprends maintenant XmlDocument mais je viens de rencontrer XDocument et quand j'essaie de rechercher la différence ou les avantages de ceux-ci, je ne peux pas trouver quelque chose d'utile, pourriez-vous s'il vous plaît me dire pourquoi vous utiliseriez l'un sur l'autre?


445
2017-10-09 06:19


origine


Réponses:


Si vous utilisez .NET version 3.0 ou inférieure, vous avoir utiliser XmlDocument aka l'API DOM classique. De même, vous trouverez d'autres API qui s'y attendront.

Si vous avez le choix, cependant, je vous recommande fortement d'utiliser XDocument aka LINQ en XML. Ses 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
    ));

C'est beaucoup plus déclaratif, ce qui cadre bien avec le style LINQ général.

Maintenant, comme Brannon l’a mentionné, ce sont des API en mémoire plutôt que des XStreamingElement prend en charge la sortie paresseuse). XmlReader et XmlWriter sont les moyens normaux de diffuser XML dans .NET, mais vous pouvez combiner 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, lire un XElement à partir de cela et le traitement, puis passer à l'élément suivant, etc. Il existe divers billets de blog sur cette technique, voici celui que j'ai trouvé avec une recherche rapide.


452
2017-10-09 06:26



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 Est-ce que (à travers le IXmlLineInfo interface).

Cela peut être une caractéristique critique dans certains cas (par exemple si vous voulez signaler des erreurs dans un fichier XML, ou garder une trace de l'endroit où les éléments sont définis en général) et vous devriez en être conscient avant de commencer à utiliser XmlDocument, pour découvrir plus tard que vous devez tout changer.


49
2017-08-29 05:12



XmlDocument est idéal pour les développeurs familiarisés avec le modèle d'objet XML DOM. Il existe depuis un moment et correspond plus ou moins à un standard W3C. Il prend en charge la navigation manuelle ainsi que XPath sélection de nœud.

XDocument alimente la fonctionnalité LINQ to XML de .NET 3.5. Il fait un usage intensif de IEnumerable<> et peut être plus facile à travailler en C # droit.

Les deux modèles de document nécessitent que vous chargiez tout le document en mémoire (contrairement à XmlReader par exemple).


32
2017-10-09 06:26



XDocument est de l'API LINQ to XML, et XmlDocument est l'API de style DOM standard pour XML. Si vous connaissez bien DOM, et ne voulez pas apprendre LINQ en XML, allez-y XmlDocument. Si vous êtes nouveau à la fois, consultez cette page cela compare les deux, et choisissez celui qui vous plaît le mieux.

Je viens juste de commencer à utiliser LINQ to XML et j'adore la façon dont vous créez un document XML en utilisant une construction fonctionnelle. C'est vraiment sympa. DOM est maladroit en comparaison.


22
2017-10-09 06:26



Comme mentionné ailleurs, sans aucun doute, Linq to Xml rend la création et l'altération de documents XML un jeu d'enfant par rapport à XmlDocument, et le XNamespace ns + "elementName" la syntaxe permet une lecture agréable lorsqu’il s’agit d’espaces de noms.

Une chose à mentionner pour xsl et xpath die difficile de noter est qu'il est possible d'exécuter encore arbitraire xpath 1.0 expressions sur Linq 2 Xml XNodes en incluant:

using System.Xml.XPath;

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

21
2017-12-20 18:19



Notez également que XDocument est pris en charge dans Xbox 360 et Windows Phone OS 7.0. Si vous les ciblez, développez pour XDocument ou émigrer de XmlDocument.


14
2017-09-27 15:28



En plus du commentaire de W0lands ci-dessus, la même chose s'applique lors de la construction de projets Unity3D pour Windows 8. Vous devrez également utiliser XDocument dans ce scénario.


3
2017-08-10 09:51



je crois que XDocument fait beaucoup plus d'appels de création d'objets. Je soupçonne que lorsque vous manipulez beaucoup de documents XML, XMLDocument sera plus rapide.

Un endroit où cela arrive est dans la gestion des données d'analyse. De nombreux outils d'analyse produisent leurs données en XML (pour des raisons évidentes). Si vous devez traiter beaucoup de ces fichiers numérisés, je pense que vous aurez de meilleures performances avec XMLDocument.


-8
2018-04-27 20:28