XmlDocument vs XDocument(示例和比较)
有几种方法可以与 Xml 文件进行交互。
- Xml 文档
- 的 XDocument
- 的 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);