【问题标题】:How to detect XPath represent a leaf node or node set?如何检测 XPath 表示叶节点或节点集?
【发布时间】:2014-08-14 12:40:30
【问题描述】:

我有以下 xml 示例文件,我将使用 XPath 获取数据(XPath 是随机给出的,无法识别 XPath 是代表叶节点还是节点集)。

叶节点xpath示例:- /OrderResponse/OrderLine[2]/LineItem/ID

节点集xpath的示例:- /OrderResponse/OrderLine

有没有办法使用 java 检测 xpath 表示叶元素或节点集?

<OrderResponse>
    <ID>79858</ID>
    <IssueDate>2011-05-04</IssueDate>
    <OrderLine>
        <LineItem>
            <ID>1</ID>
            <SalesOrderID>1</SalesOrderID>
            <Note>tCP</Note>
            <LineStatusCode>1</LineStatusCode>
            <Quantity unitCode="PCE">1.0</Quantity>
        </LineItem>
    </OrderLine>
    <OrderLine>
        <LineItem>
            <ID>2</ID>
            <SalesOrderID>2</SalesOrderID>
            <LineStatusCode>2</LineStatusCode>
            <Quantity unitCode="PCE">2.0</Quantity>
        </LineItem>
    </OrderLine>
</OrderResponse>

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    这两个 XPath 都选择节点集,但从您的问题中可以清楚地看出,“节点集”是指“非叶节点集”。

    显然,无法仅通过查看 XPath 来判断它是否会选择叶节点、非叶节点、两者都选择,或者什么都不选择,但您可以这样做:

    选择两个 XPath,一个用于 (TheOriginalXPath) + [*],另一个用于 (TheOriginalXPath) + [not(*)],所以:

    /OrderResponse/OrderLine[2]/LineItem/ID[*]
    

    /OrderResponse/OrderLine[2]/LineItem/ID[not(*)]
    
    • 如果只有第一个查询返回结果,那么节点是非叶子元素
    • 如果只有第二个查询返回结果,则节点为叶节点
    • 如果两者都返回结果,则 XPath 匹配叶节点和非叶元素的混合体
    • 如果两者都没有返回结果,则 XPath 不匹配任何内容

    【讨论】:

    • 这正是我所期望的。非常感谢您帮助我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多