为客户做了一年的xml处理工作,觉得应该把xpath总结一下。
利用puginxml解析xml文档,利用树形的节点方式进行查询,本身支持xpath。
1、关于节点和匹配属性:
/SCL/Substation/VoltageLevel[@Private='aaaa']
SCL为xml树的根节点,知道了节点层级路径可以轻松找到VoltageLevel,而通过属性值过滤出我们希望得到的话追加后面部分,注意语法,条件[]括起,属性前加@
,属性值用单引号括起。
2、需要多个节点
/SCL/Substation/VoltageLevel/LN0,/SCL/Substation/VoltageLevel/LN我们可以写两句分别获取,这种效率就低了,我们可以合成一句话:/SCL/Substation/VoltageLevel/*[local-name()='LN0' or local-name()='LN']这里用到了XPath的一个函数,*代表所有,没有后面条件就是VoltageLevel所有子节点了。
3、用户提出需要对某个节点下的符合条件的LNode进行查询
开始我按照规则查找,用了多个语句,可是后来增加了许多的包含特例,于是我修改了一下如下:
QString("//LNode[@lnInst='%1' and @lnClass='%2' and @iedName='%3' and @ldInst='%4']")这里的%1-4是Qt的QString一个字符替换规则,那么前面的//这两个符号就是代表所有节点,这样我们可以查找该节点下的所有符合条件的LNode,即使这个节点放在很深的层次。
4、关于text条件查询
<LNode> aaaaa </LNode> 找到text == aaaaa 的LNode节点,用XPath也可以轻松找到:"LNode[normalize-space(text()) = 'aaaaa']",
normalize-space()用来将一个字符串的头部和尾部的空白字符删除,这个是客户要求的。这里寻找text我们使用text()这个函数。