根据位置返回列表中的顶级元素

时间:2017-01-05 03:26:50

标签: xml xpath

我正在尝试使用XPath生成一个分页表。

以下是两个项目的示例:

<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:constr="Array" d:mi="114">
    <d:item d:mi="24">
        <name d:constr="String" d:mi="13">/Partition/MYLB1</name>
        <ip d:constr="String" d:mi="14">1.1.1.1</ip>
        <port d:constr="String" d:mi="15">80</port>
        <pools d:constr="null"/>
        <loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer>
    </d:item>
    <d:item d:mi="51">
        <name d:constr="String" d:mi="25">/Partition/MYLB2</name>
        <ip d:constr="String" d:mi="26">2.2.2.2</ip>
        <port d:constr="String" d:mi="27">443</port>
        <pools d:mi="47" d:type="ArrayItem">
            <name d:constr="String" d:mi="46">myPool</name>
        </pools>
        <loadbalancer d:constr="String" d:mi="50">LB2</loadbalancer>
    </d:item>
    <d:item d:mi="24">
        <name d:constr="String" d:mi="13">/Partition/MYLB1</name>
        <ip d:constr="String" d:mi="14">1.1.1.1</ip>
        <port d:constr="String" d:mi="15">80</port>
        <pools d:constr="null"/>
        <loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer>
    </d:item>       
</d:data>

假设我只想要此列表中的前两项,我该如何实现?

使用此查询进行管理:

//*[name][position() <= 1]

但是,我怀疑如果我稍后再添加更多子项,其中一个具有属性“name”,那么它也会受到影响。

这是我认为会起作用的,但它会返回很多我只期望的物品:

//*[position() <= 1] 

我已经搜索了如何只匹配第一级孩子,如何获得数组的位置。但是在每个出现的线程中,他们知道他们搜索的是哪个值,而我只想独立于其内容或祖先数量返回元素。

对我如何思考错误以及如何正确行事的解释将非常感激!

2016-01-05 - 编辑:修改示例中较低级别的“name”。

还添加了一个示例:

我需要xpath才能返回顶级项目:

即:

<d:item d:mi="24">
    <name d:constr="String" d:mi="13">/Partition/MYLB1</name>
    <ip d:constr="String" d:mi="14">1.1.1.1</ip>
    <port d:constr="String" d:mi="15">80</port>
    <pools d:constr="null"/>
    <loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer>
</d:item>

但不是:

<name d:constr="String" d:mi="46">myPool</name>

/帕特里克

1 个答案:

答案 0 :(得分:0)

//*[position() <= 1]将匹配任何父元素的每个第一个子元素。如果您只想匹配<d:item d:mi="12"><d:item d:mi="24">,那么无论您将来添加多少元素添加到父元素,都应该使用

//*[name][position() <= 2]

这些XPath应该更合适:

//*[name()="d:data"]/*[name][position() <= 2]

//*[name()="d:data"]/*[name()="d:item"][position() <= 2]
相关问题