开源.NetCore通用工具库Xmtool使用连载 - XML操作篇
|
【Github源码】
《上一篇》 介绍了Xmtool工具库中的发送短信类库,今天我们继续为大家介绍其中的XML操作类库。
XML操作是软件开发过程中经常会遇到的情况;包括XML内容的遍历解析,或者特定值内容的查询获取等等。Xmtool工具库提供了一种更方便的方式对Xml进行遍历解析或者对特定节点内容的获取,下面将详细说明。Xmtool工具库中提供了XmlTool类库,用以对Xml内容进行操作。该类库以回调方法的方式遍历XML内容的功能,使得Xml读取更灵活快捷,且能随时停止遍历过程;同时提供了将Xml内容反序列化为对象的能力,通过该方法可以将输入参数方便的转换成对象,更易于使用和控制。
当要使用这些功能时,需先获取XmlTool类库对象:- XmlTool xml = Xmtool.Xml();
复制代码 针对遍历和反序列化功能根据输入源不同,XmlTool中为每个功能各自提供了 2 个方法。
Xml遍历方法:
Iterate // 从文件加载Xml内容
IterateFromString // 从字符串加载Xml内容
Xml反序列化方法:
Deserialize // 从文件加载Xml内容
DeserializeFromString // 从字符串加载Xml内容
1. Iterate
public void Iterate(string file, XmlNodeInfoGetter callback = null)
说明:从指定文件加载Xml内容并进行遍历,用户通过回调函数获取遍历信息
参数:
file: Xml文件全路径。
callback:XmlNodeInfoGetter类型回调函数,用于Xml节点和属性的读取。- <xml>
- <item name="Karl">It's a dog.</item>
- <item name="Tom">It's a cat.</item>
- </xml>
复制代码- private string mTomContent = "";
- private bool XmlReader(XmlNodeInfo node)
- {
- if (!node.IsEndNode)
- {
- if (node.Path == "/xml/item") // 当前节点是否/xml/item节点
- {
- if (node.GetAttribute("name") == "Tom") // 当前节点name属性是否为Tom
- {
- mTomContent = node.Text; // 获取Tom的说明文本
- return false; // 退出遍历
- }
- }
- }
- return true;
- }
- public void GetTomContent(string file)
- {
- XmlTool xml = Xmtool.Xml();
- xml.Iterate(file, XmlReader)
- }
- ReadXml("c:\demo.xml");
- Console.WriteLine(mTomContent)
复制代码 2. IterateFromString
public void Iterate(string content, XmlNodeInfoGetter callback = null)
说明:从指定字符串加载Xml内容并进行遍历,用户通过回调函数获取遍历信息
参数:
content: Xml格式的字符串内容。
callback:XmlNodeInfoGetter类型回调函数,用于Xml节点和属性的读取。- string xmlData = @"<xml>
- <name>张三</name>
- <age>18</age>
- <gender>男</gender>
- </xml>";
- XmlTool xml = Xmtool.Xml();
- xml.IterateFromString(xmlData, (XmlNodeInfo node) =>
- {
- if (!node.IsEndNode)
- {
- if (node.Path = "/xml/age")
- {
- Console.WriteLine("张三的年龄为:" + node.Text);
- return false;
- }
- }
- return true;
- })
复制代码 3. Deserialize
public dynamic Deserialize(string file, bool includeRoot = false)
说明:从指定文件加载Xml内容并进行解析,将解析内容反序列化为动态对象;暂不支持包含同层级同名称节点的Xml内容反序列化。
参数:
file: Xml文件全路径。
includeRoot:反序列化时是否包含根节点。- <person>
- <name>张三</name>
- <age>18</age>
- </person>
复制代码- XmlTool xml = Xmtool.Xml();
- dynamic person = xml.Deserialize("c:\demo.xml", false);
- Console.WriteLine("张三的年龄为:" + person.name.Value);
复制代码 4. DeserializeFromString
public dynamic DeserializeFromString(string xml, bool includeRoot = false)
说明:从字符串内容加载Xml并进行解析,将解析内容反序列化为动态对象;暂不支持包含同层级同名称节点的Xml内容反序列化。
参数:
content: Xml格式的字符串内容。
includeRoot:反序列化时是否包含根节点。- string xmlData = @"<xml>
- <person age="18" gender="男">张三</person>
- </xml>";
- XmlTool xml = Xmtool.Xml();
- dynamic person = xml.DeserializeFromString(xmlData);
- Console.WriteLine("张三的年龄为:" + person.person.age);
复制代码 附件说明
XmlNodeInfoGetter回调函数
public delegate bool XmlNodeInfoGetter(XmlNodeInfo nodeInfo);
说明:Xml遍历回调函数;Xml遍历到每个节点就会回调该方法一次,参数是遍历到的当前节点。
参数:
nodeInfo:当前节点信息。
名称 | 类型 | 说明 | Path | 属性 | 当前节点路径,同名路劲不区分;如:/xml/item | FullPath | 属性 | 当前节点路径,区分同名路径;如:/xml/item[1] | LocalName | 属性 | 节点去掉前缀的名称;如:\,该节点LocalName为item。 | FullName | 属性 | 节点全名称;如:\,该节点FullName为w:item。 | NamespaceURI | 属性 | 当前节点名称前缀对应的命名空间地址;没有前缀为空。 | IsRoot | 属性 | 当前节点是否根节点。 | IsNode | 属性 | 当前是否节点,起始节点或结束节点。 | IsEndNode | 属性 | 当前节点是否为结束节点;如:\ | IsEmptyNode | 属性 | 当前节点是否一个空节点;如:\ | IsTextNode | 属性 | 当前节点是否一个字符内容的节点。 | IsCDATANode | 属性 | 当前节点是否一个CDATA节点;如:\Text | Text | 属性 | 当前节点的的字符串内容;需IsTextNode为true时有效。 | CData | 属性 | 当前节点的CDATA内容;需IsCDATANode为true时有效。 | Level | 属性 | 当前节点的深度层级。 | Line | 属性 | 当前节点在文件中的所在行数。 | AttributeCount | 属性 | 当前节点包含属性的个数。 | HasAttributes() | 方法 | 当前节点是否包含属性。 | GetAttribute(int index) | 方法 | 返回属性位置为index的属性值。 | GetAttribute(string name) | 方法 | 返回属性名称为name的属性值。 | GetAttribute(string name, string namesapceURI) | 方法 | 返回属性名为name,且name命名空间为namespaceURI的属性值。 | GetAttributeName(int index) | 方法 | 返回属性位置为index的属性名称。 |
【Github源码】
来源:https://www.cnblogs.com/bcbr/archive/2023/08/05/17608881.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|
|
|
发表于 2023-8-6 01:45:29
举报
回复
分享
|
|
|
|