C# Language XmlDocument vs XDocument (exemple et comparaison)


Exemple

Il existe plusieurs manières d’interagir avec un fichier Xml.

  1. Document XML
  2. XDocument
  3. XmlReader / XmlWriter

Avant LINQ to XML, nous avons utilisé XMLDocument pour des manipulations en XML, comme l'ajout d'attributs, d'éléments, etc. Maintenant, LINQ to XML utilise XDocument pour le même genre de chose. Les syntaxes sont beaucoup plus simples que XMLDocument et requièrent une quantité minimale de code.

Aussi XDocument est plus rapide que XmlDocument. XmlDoucument est une solution ancienne et sale pour interroger un document XML.

Je vais montrer quelques exemples de classes XmlDocument et de classes XDocument :

Charger un fichier XML

string filename = @"C:\temp\test.xml";

XmlDocument

XmlDocument _doc = new XmlDocument();
_doc.Load(filename);

XDocument

XDocument _doc = XDocument.Load(fileName);

Créer XmlDocument

XmlDocument

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

XDocument

 XDocument doc = new XDocument(
    new XElement("Root", new XAttribute("name", "value"), 
    new XElement("Child", "text node"))
);

/*result*/
<root name="value">
    <child>"TextNode"</child>
</root>

Changer InnerText de noeud en XML

XmlDocument

XmlNode node = _doc.SelectSingleNode("xmlRootNode");
node.InnerText = value;

XDocument

 XElement rootNote = _doc.XPathSelectElement("xmlRootNode"); 
rootNode.Value = "New Value";

Enregistrer le fichier après modification

Assurez-vous de sécuriser le XML après tout changement.

// Safe XmlDocument and XDocument
_doc.Save(filename);

Récupérer des valeurs à partir de XML

XmlDocument

 XmlNode node = _doc.SelectSingleNode("xmlRootNode/levelOneChildNode");
string text = node.InnerText;

XDocument

 XElement node = _doc.XPathSelectElement("xmlRootNode/levelOneChildNode");
 string text = node.Value;

Récupérer la valeur de tous les éléments enfants où attribut = quelque chose.

XmlDocument

List<string> valueList = new List<string>(); 
    foreach (XmlNode n in nodelist)
    {
        if(n.Attributes["type"].InnerText == "City")
        {
            valueList.Add(n.Attributes["type"].InnerText);
        }
    }

XDocument

var accounts = _doc.XPathSelectElements("/data/summary/account").Where(c => c.Attribute("type").Value == "setting").Select(c => c.Value);

Ajouter un noeud

XmlDocument

XmlNode nodeToAppend = doc.CreateElement("SecondLevelNode");
nodeToAppend.InnerText = "This title is created by code";

/* Append node to parent */
XmlNode firstNode= _doc.SelectSingleNode("xmlRootNode/levelOneChildNode");
firstNode.AppendChild(nodeToAppend);

/*After a change make sure to safe the document*/
_doc.Save(fileName);

XDocument

_doc.XPathSelectElement("ServerManagerSettings/TcpSocket").Add(new XElement("SecondLevelNode"));

 /*After a change make sure to safe the document*/
_doc.Save(fileName);