【C#】创建、解析 xml 文件(XmlDocument 方式)

您所在的位置:网站首页 创建xml文件并写入数据库中的方法 【C#】创建、解析 xml 文件(XmlDocument 方式)

【C#】创建、解析 xml 文件(XmlDocument 方式)

2024-06-04 13:03| 来源: 网络整理| 查看: 265

前言

本文使用 System.Xml 中的 XmlDocument 解析 xml 格式的文件。另外,由于我是粗略的看了下官方文档和一些博客,可能会有许多错误的地方,望指出。

官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.xml.xmldocument?view=netframework-4.8

文章时间:

写于 2019-7-17 1 创建 Xml XmlDocument tDoc = new XmlDocument(); // 一些声明信息 XmlDeclaration xmlDecl = tDoc.CreateXmlDeclaration("1.0", "utf-8", null); tDoc.AppendChild(xmlDecl); // 新建根节点 XmlElement root = tDoc.CreateElement("root"); tDoc.AppendChild(root); // root 下的子节点 XmlElement toTalTick = tDoc.CreateElement("TotalTick"); toTalTick.InnerText = "10"; root.AppendChild(toTalTick); //注意这里是 root.AppendChild // root 下的子节点 XmlElement demension = tDoc.CreateElement("Demension"); demension.InnerText = "2"; root.AppendChild(demension); // root 下的子节点 XmlElement tickLine = tDoc.CreateElement("TickLine"); root.AppendChild(tickLine); for(int i = 0; i < 10; i++) { // TickLine 下的子节点 Tick XmlElement tick = tDoc.CreateElement("Tick"); // 给 Tick 增加属性值 XmlAttribute attr = tDoc.CreateAttribute("Value"); attr.Value = i.ToString(); tick.Attributes.Append(attr); tickLine.AppendChild(tick); } // 保存 tDoc.Save("data.xml");

上面的程序将生成一个这样一个 xml 格式的文件

10 2

输出格式好像不是很舒服,我习惯是 4 个空格缩进,可以通过以下方式保存,控制格式

//同上... XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = System.Text.Encoding.UTF8; //默认其实就是 UTF-8 这里记下怎么写 settings.Indent = true; //需要缩进元素 settings.IndentChars = " "; //使用 四个空格 缩进 XmlWriter writer = XmlWriter.Create("data.xml", settings); tDoc.Save(writer);

更多有关信息,可看 XmlWriterSettings 这样就可以得到我习惯的格式了,另外 Save 会覆盖原来的文件

10 2 2 解析 Xml

若已知一个这样的 xml 文档(省略了一些不重要的部分)

10 2 ... ... ... ... 2.1 定位单个节点

已经知道节点的名字,如何获取值呢,如果同名节点很多怎么办?

2.1.1 方式一

通过 XmlNode 的 SelectSingleNode 方法定位到指定节点

// XmlDocument x = new XmlDocument(); // ... XmlNode root = x.DocumentElement; XmlNode e = root.SelectSingleNode("TotalTick"); Console.WriteLine(e.InnerText);

需要注意的是,这个方法传入的是 XPath,建议看一下 XPath示例,这里就不再展开讲,通过 XPath,查找元素不担心!

举个例子:

XmlNode e = root.SelectSingleNode("TickLine/Tick[@Value = '1']");

这样就定位到了 root 的子节点 TickLine 的其属性 Value 值为 1 的 Tick 子节点

2.1.2 方式二(操作符[]定位)

没有仔细研究过,看下面的示例

// XmlDocument x = new XmlDocument(); // ... XmlNode root = x.DocumentElement; XmlNode e = root["TotalTick"]; Console.WriteLine(e.InnerText); 2.2 获取节点列表

和 2.1 的方式一类似,使用 XmlNode 的 SelectNodes 方法

// XmlDocument x = new XmlDocument(); // ... XmlNode root = x.DocumentElement; XmlNodeList tickList = root.SelectNodes("TickLine/Tick"); foreach(XmlNode tick in tickList) { foreach(XmlNode person in tick) { Console.WriteLine(person.OuterXml); } } 2.3 获取节点属性值

我想获取 Tick 的属性 Value = 1 的节点,并输出其中所有 Person 的属性

2.3.1 方式一

使用 XmlNamedNodeMap 的 GetNameItem 方法

// XmlDocument x = new XmlDocument(); // ... int n = 1; XmlNode root = x.DocumentElement; XmlNode tick = root.SelectSingleNode($"TickLine/Tick[@Value = '{n}']"); foreach(XmlNode person in tick) { XmlAttribute attr1 = (XmlAttribute)person.Attributes.GetNamedItem("id"); XmlAttribute attr2 = (XmlAttribute)person.Attributes.GetNamedItem("x"); XmlAttribute attr3 = (XmlAttribute)person.Attributes.GetNamedItem("z"); Console.WriteLine($"{attr1.Value}, {attr2.Value}, {attr3.Value}"); }

注解:XmlNode.Attributes 返回一个 XmlAttributeCollection,然后再使用 GetNameItem(返回 XmlNode)

另注继承关系:

Object -> XmlNamedNodeMap -> XmlAttributeCollectionObject -> XmlNode -> XmlAttribute 2.3.2 方式二

使用 XmlElement 的 GetAttribute 方法

// XmlDocument x = new XmlDocument(); // ... int n = 1; XmlNode root = x.DocumentElement; XmlNode tick = root.SelectSingleNode($"TickLine/Tick[@Value = '{n}']"); foreach(XmlNode person in tick) { XmlElement tmp = (XmlElement)person; Console.WriteLine($"{tmp.GetAttribute("id")}, {tmp.GetAttribute("x")}, {tmp.GetAttribute("z")}")); }

注意,GetAttribute 返回的是字符串 string,如果要获取 XmlAttribute,可使用 GetAttributeNode

另注继承关系:Object -> XmlNode -> XmlLinkedNode -> XmlElement

小结

暂时写这么多吧,常用的写在这里,以后如果有需要再补充



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3