开源.NetCore通用工具库Xmtool使用连载 - XML操作篇

发布时间 2023-08-05 23:49:45作者: bcbr_wang

【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节点;如:\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源码】