TinyXML(TinyXPath) 使用总结
更新时间:2023-07-25 22:34:01 阅读量: 实用文档 文档下载
- tiny推荐度:
- 相关推荐
原来的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的人有帮助。
才是
正在阅读:
用费马原理导出光的反射定律和折射定律兰林11-19
意外的发现作文400字07-10
管理文件用表10-26
意外的温柔作文500字07-15
CISP试题及答案-7套题10-16
教师专业成长档案模板02-20
2018年入党积极分子思想汇报范文五篇12-15
客户关系管理案例分析01-19
惭愧学人论乙木11-19
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- TinyXPath
- TinyXML
- 总结
- 使用
- 浅析出版行业成本控制
- 2010高考二轮复习化学教案:专题八《电化学》
- 消防报审验收流程文字说明
- 服务器虚拟化技术在政务系统资源整合中的应用
- 小学高年级学生自律性培养策略
- 计算机辅助三维穿刺系统的研制.kdh
- 体验会计,体验精彩
- 中医基础理论整理笔记
- 新华大宗商品之新华原油代理招商
- 第五讲:氧化还原反应的规律
- 基于多壁碳纳米管修饰的葡萄糖生物传感器
- 小学四年级上册数学期末复习卷
- 鄂尔多斯市天骏公司塔拉壕卡车物流服务中心
- 城区夜景照明建设工程设计原则和要求
- 江苏苏州拙政园导游词
- 消防安全员岗位职责
- 《新形势下对央行事后监督职能发挥的思考 央行的职能》
- 西餐零点服务程序(五)
- 安徽省机动车驾驶培训教练员教学服务规范
- 专业英语课后习题答案unit1-9完整+10~13非完整版