XmlDocument vs XDocument(示例和比較)

有幾種方法可以與 Xml 檔案進行互動。

  1. Xml 文件
  2. 的 XDocument
  3. 的 XmlReader / XmlWriter 的

在 LINQ to XML 之前,我們使用 XMLDocument 在 XML 中進行操作,例如新增屬性,元素等。現在 LINQ to XML 使用 XDocument 來做同樣的事情。語法比 XMLDocument 容易得多,並且它需要最少量的程式碼。

此外,XDocument 作為 XmlDocument 變得更快。XmlDoucument 是查詢 XML 文件的舊而髒的解決方案。

我將展示一些 XmlDocument 類XDocument 類 類的示例

載入 XML 檔案

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

XmlDocument

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

XDocument

XDocument _doc = XDocument.Load(fileName);

建立 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>

在 XML 中更改節點的 InnerText

XmlDocument

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

XDocument

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

編輯後儲存檔案

確保在任何更改後保護 xml。

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

XML 的 Retreive 值

XmlDocument

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

XDocument

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

從屬性=某事物的所有子元素中獲取所有值的 Retreive 值。

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

附加節點

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