开源.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文件全路径。

callbackXmlNodeInfoGetter类型回调函数,用于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格式的字符串内容。

callbackXmlNodeInfoGetter类型回调函数,用于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节点;如:\<![CDATA[hello]]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源码】
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值