我正在尝试找到一种基于xpath表达式将大型xml文件划分为块的方法。
据我所知,只有给出具有相同父节点的节点的xpath表达式才能用于将xml文件划分为块。如何检测用户输入的xpath表达式是否会导致节点具有相同的父节点?
例如,请考虑以下xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<firstname>Asanka</firstname>
<lastname>Sanjeewa</lastname>
<address>
<no>No.123</no>
<road>Main Street</road>
<city>Negombo</city>
</address>
</employee>
<employee>
<firstname>Kamal</firstname>
<lastname>Silva</lastname>
<address>
<no>No.123</no>
<road>Main Street</road>
<city>Negombo</city>
</address>
</employee>
<employee>
<firstname>Roshan</firstname>
<lastname>Fernando</lastname>
<address>
<no>No.123</no>
<road>Main Street</road>
<city>Negombo</city>
</address>
</employee>
</employees>
如果给了xpath表达式:// employees / employee / firstname,从这个表达式获得的节点会产生具有不同父节点的firstname节点。但是如果我给了xpath表达式// employees / employee,那么结果节点具有相同的父节点。如何检测这样的xpath表达式,它们为节点提供了相同的父节点?
答案 0 :(得分:2)
获取用户输入的XPath表达式,并将其括在括号中。然后将/..
添加到结尾,并将整个内容包装在count
函数中。这将为您提供从原始查询返回的不同父元素的数量。如果答案是1,则您知道结果节点具有相同的父节点。如果答案不止一个,您就知道不能通过给定的XPath表达式拆分XML。
示例:
//employees/employee/firstname
变为count((//employees/employee/firstname)/..)
并提供结果3
//employees/employee
变为count((/employees/employee)/..)
,并提供结果1
从这些示例中,您会看到将原始XPath表达式括在括号中似乎是不必要的,但除非您知道您的用户不会输入类似//firstname | //employee
的表达式,否则它很重要,因为否则它会没有正确计算结果中父母的数量。