TinyXML(TinyXPath) 使用总结

更新时间:2023-07-25 22:34:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

原来的Windows 平台下的项目使用了MSXML组件来访问Web Service 接口,后来因为跨平台的需要,在Linux平台下改用了GSOAP+TinyXML(TinyXPath)来完成所需功能。使用TinyXPath还是遇到了一些问题,总结一下。

这里要说明一下TinyXPath是TinyXML+XPath,下载TinyXPath包的时候会包含TinyXML的原文件。

1. 使用XPath,来获取XML子节点

TinyXpath所支持的XPath并不完整,而且缺少文档资料,试了一整天才试出来,直接把结果写下来

1.)节点名大小写无关匹配

这里要用到name函数和translate函数,首先转化所有的节点名到大写,然后再比较。语法如下:

*[translate(name(),

'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='XXXX'] name函数返回节点名字,translate函数转换到大写。

2.)节点内容比较

text函数返回节点内容, 语法为

*[text()='XXXX']

3.)选择固定位置节点

position函数用以指定第几个节点,语法为:

*[position()=XXX] ,此处是数字类型

举个例子,我们要选定节点名字为AAA,内容为BBB的第二个节点,XPath应改名为:

*[translate(name(),

'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='AAA' and text()='BBB' and position()=2]

这里还有个查询效率问题,并不确定把 position()=2 条件放在最前面是不是可以提高效率。以上内容可以封装成一个函数:

inline string getNodeXPath(const string & strNodeName, string strText="", string pos="")

{

string strVal;

strVal += "*[";

strVal += "translate(name(),

'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ') = '"+ strNode Name + "'";

if(!strText.empty())

strVal +=" and text()= '" +strText+"'";

if(!pos.empty())

strVal +=" and position()= " +pos;

strVal += "]";

return strVal;

}

#define NODE(node) getNode(node)

#define NODE_AT(node,pos) getNode(node,"",pos)

4.) 查询子节点满足一定条件的节点

没有看到TinyXPath提供的直接可以获取子节点内容的函数,这里使用变通的方法,即先判断子节点条件然后使用parent关键词指定返回父节点 , 定义了HAS_CHILD宏

#define HAS_CHILD(node,txt)

string(string("/")+getNode(node,txt)+string("/parent::*"))

举个例子:

string strXPath;

strXPath= "/" + NODE("XMLDATA") + "/" + NODE("RATES") ;

strXPath+= "/" + NODE("REPORATEVO")

+HAS_CHILD("TERMBYYEAR",mStrType)+HAS_CHILD("CONTRACTDATE",mStrSubType);

strXPath+= "/" + NODE("RATE");

多个HAS_CHILD之间是并列关系。

以下是获取节点的代码段:

TiXmlDocument xdoc;

xdoc.Parse(wsResponse.c_str());

if(xdoc.Error())

{

return 3;

}

const TiXmlElement * xmain=xdoc.RootElement();

TinyXPath::xpath_processor xproc(xmain,xpath.c_str()); unsigned nodeCount =xproc.u_compute_xpath_node_set(); if(nodeCount==0)

{

return 4;

}

TiXmlNode * xnode = xproc.XNp_get_xpath_node(0);

2. 子节点内容读取

TiXmlPrinter 提供了获取节点内容到内存的方法,

代码如下:

TiXmlPrinter printer;

xchild->Accept(&printer);

strRes = printer.CStr();

这里有个问题,打印时候'/n'回车符,保存的字符串里会是空格,'/r/n' 回车换行。

总结到这里,希望对使用TinyXPath的人有帮助。

才是

本文来源:https://www.bwwdw.com/article/6iem.html

Top