开源.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节点和属性的读取。
<!--c:\demo.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:反序列化时是否包含根节点。
<!--c:\demo.xml-->
<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源码】
开源.NetCore通用工具库Xmtool使用连载 - XML操作篇的更多相关文章
- 开源.NetCore通用工具库Xmtool使用连载 - 加密解密篇
[Github源码] <上一篇>详细介绍了Xmtool工具库中的正则表达式类库,今天我们继续为大家介绍其中的加密解密类库. 在开发过程中我们经常会遇到需要对数据进行加密和解密的需求,例如密 ...
- 如何配置开源中国Maven库以加快依赖包下载速度
有时有某些地方由于网络问题,访问maven主仓库比较慢,甚至有可能无法下载某些jar包,此时可以把开源中国Maven库配置到settings.xml文件中,加快依赖包的下载速度. 具体如何配置? 在m ...
- Win10 UWP开发系列——开源控件库:UWPCommunityToolkit
在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在G ...
- 1. Android 系统上一款开源的图表库
1. MPAndroidChart MPAndroidChart 是 Android 系统上一款开源的图表库.目前提供线图和饼图,支持选择.缩放和拖放. 一个可以拖动缩放的图表库,包含曲线图.直方图 ...
- iOS、mac开源项目及库汇总
原文地址:http://blog.csdn.net/qq_26359763/article/details/51076499 iOS每日一记------------之 中级完美大整理 iOS.m ...
- IOS学习:常用第三方库(GDataXMLNode:xml解析库)
IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...
- Android开源项目及库搜集
TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending,github搜索:https://github.com/ ...
- 开源.NET界面库
一.十大开源的.NET用户界面框架 选择一款合适的GUI框架是.NET开发中比较重要但又很棘手的问题,因为用户界面相当于一款应用的"门面",直接面向用户.好的UI更能吸引用户,有时 ...
- 值得推荐的C/C++开源框架和库
值得推荐的C/C++开源框架和库 转自:http://www.cnblogs.com/lidabo/p/5514155.html - 1. Webbench Webbench是一个在Linux下 ...
- Facebook开源的JavaScript库:React
React是Facebook开源的JavaScript库,采用声明式范例,可以传递声明代码,最大限度地减少与DOM的交互. React是Facebook开源的JavaScript库,用于构建UI.你可 ...
随机推荐
- MASAMinimalAPI:创建MinimalAPI项目
项目准备 1.创建项目,选择webapi.取消勾选使用控制器.创建minimal Api项目 2.创建成功后MinimalAPI的接口直接写在program.cs中 3.引入nuget包:Masa.C ...
- 2022-12-07:删除重复的电子邮箱。删除重复数据后,id=3的数据被删除。请问sql语句如何写? DROP TABLE IF EXISTS `person`; CREATE TABLE `per
2022-12-07:删除重复的电子邮箱.删除重复数据后,id=3的数据被删除.请问sql语句如何写? DROP TABLE IF EXISTS `person`; CREATE TABLE `per ...
- 2022-09-02:以下go语言代码输出什么?A:9;B:11;C:编译错误;D:不确定。
2022-09-02:以下go语言代码输出什么?A:9:B:11:C:编译错误:D:不确定. package main import ( "fmt" ) func main() { ...
- 【故障公告】博客站点一台阿里云负载均衡被DDoS攻击
13:06 收到阿里云的电话与邮件通知,博客站点的一台阿里云负载均衡因被 DDoS 攻击被关进黑洞(所有访问被屏蔽),部分用户的访问受影响,由此给您带来麻烦,请您谅解. 您的IP:x.x.x.x 实例 ...
- ent M2M模型在pxc集群中的一个大坑
ent M2M模型在pxc集群中的一个大坑 事故简要分析 PXC集群3个节点,在插入数据时,如果使用数据库自己生成的主键,一般顺序为1,4,7,10- 这里就是坑的源头,在ent底层代码中,在做M2M ...
- 解决echarts图形由于label过长导致文字显示不全问题
使用echarts 打印饼图,在pc没问题,但一到移动端问题就来了,由于屏幕过小,导致label部分被遮挡 一.问题分析 如上图这个就尴尬了,囧么办呢? 还好echarts 提供了formatter方 ...
- THM武器化
Weaponization thm:https://tryhackme.com/room/weaponization 武器化 了解和探索常见的红队武器化技术.您将学习使用业内常见的方法构建自定义有效载 ...
- 万字长文讲透 RocketMQ 4.X 消费逻辑
RocketMQ 是笔者非常喜欢的消息队列,4.9.X 版本是目前使用最广泛的版本,但它的消费逻辑相对较重,很多同学学习起来没有头绪. 这篇文章,笔者梳理了 RocketMQ 的消费逻辑,希望对大家有 ...
- Codeforces Round #771 (Div. 2) A-E
A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; int p[507]; bool solv ...
- fdisk 命令 创建分区 实现扩容
fdisk 命令 创建分区 实现扩容 Linux fdisk命令简介 Linux fdisk 是一个创建和维护分区表的程序,它兼容 DOS 类型的分区表.BSD 或者 SUN 类型的磁盘列表. 菜单操 ...