前言
本文使用 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 -> XmlAttributeCollection
Object -> 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
----
小结
暂时写这么多吧,常用的写在这里,以后如果有需要再补充
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/148896.html