找到会产生同一个父级的xpath表达式?

时间:2016-02-29 07:59:22

标签: xml xpath

我正在尝试找到一种基于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表达式,它们为节点提供了相同的父节点?

1 个答案:

答案 0 :(得分:2)

获取用户输入的XPath表达式,并将其括在括号中。然后将/..添加到结尾,并将整个内容包装在count函数中。这将为您提供从原始查询返回的不同父元素的数量。如果答案是1,则您知道结果节点具有相同的父节点。如果答案不止一个,您就知道不能通过给定的XPath表达式拆分XML。

示例:

  • 输入://employees/employee/firstname变为count((//employees/employee/firstname)/..)并提供结果3
  • 输入://employees/employee变为count((/employees/employee)/..),并提供结果1

从这些示例中,您会看到将原始XPath表达式括在括号中似乎是不必要的,但除非您知道您的用户不会输入类似//firstname | //employee的表达式,否则它很重要,因为否则它会没有正确计算结果中父母的数量。