【问题标题】:Does xpath query has Limit option like mysqlxpath查询是否有像mysql这样的限制选项
【发布时间】:2012-04-11 14:13:33
【问题描述】:

我想限制从 xpath 查询收到的结果数。

例如:-

$info = $xml->xpath("//*[firstname='Sheila'] **LIMIT 0,100**"); 

你看到LIMIT 0,100

【问题讨论】:

    标签: xpath limit


    【解决方案1】:

    你应该可以使用"//*[firstname='Sheila' and position() <= 100]"

    编辑:

    给定以下 XML:

    <root> 
        <country.php desc="country.php" language="fr|pt|en|in" editable="Yes"> 
            <en/> 
            <in> 
                <cityList desc="cityList" language="in" editable="Yes" type="Array" index="No"> 
                    <element0>Abu</element0>
                    <element1>Agartala</element1>
                    <element2>Agra</element2> 
                    <element3>Ahmedabad</element3>
                    <element4> Ahmednagar</element4> 
                    <element5>Aizwal</element5>
                    <element150>abcd</element150> 
                </cityList> 
            </in> 
        </country.php> 
    </root>
    

    您可以使用以下 XPath 获取前三个城市:

    //cityList/*[position()<=3]
    

    结果:

    Node    element0    Abu
    Node    element1    Agartala
    Node    element2    Agra
    

    如果您想将此限制为以element 开头的节点:

    //cityList/*[substring(name(), 1, 7) = 'element' and position()<=3]
    

    请注意,后一个示例有效,因为您选择了 所有 cityList 的子节点,因此在这种情况下,Position() 可以按预期限制结果。如果 cityList 节点下混合有其他节点名称,您会得到不希望的结果。
    例如,如下更改 XML:

    <root> 
        <country.php desc="country.php" language="fr|pt|en|in" editable="Yes"> 
            <en/> 
            <in> 
                <cityList desc="cityList" language="in" editable="Yes" type="Array" index="No"> 
                    <element0>Abu</element0>
                    <dog>Agartala</dog>
                    <cat>Agra</cat> 
                    <element3>Ahmedabad</element3>
                    <element4> Ahmednagar</element4> 
                    <element5>Aizwal</element5>
                    <element150>abcd</element150> 
                </cityList> 
            </in> 
        </country.php> 
    </root>
    

    使用上面的 XPath 表达式,我们现在得到 ​​p>

    Node    element0    Abu
    

    请注意,我们丢失了第二个和第三个结果,因为 position() 函数正在以更高的优先级进行评估 - 与请求“给我前三个节点,现在给我所有以“元素”开头的节点”。

    【讨论】:

    • 那您能澄清一下您的问题吗?你想从那个 XML 中提取什么?
    • 感谢 Geoff 的回复。但我的 xml 格式与 AbuAgartala%2A AgraAhmedab​​ad 继续喜欢 .... abcd 我必须选择元素,所以我的xpath(/root/country.php/fr/cityList[position()
    • Geoff ... 正在做分页。我必须选择一堆节点[如元素(n)]。
    • 第一:有没有理由将数字作为元素名称的一部分?比&lt;element1/&gt; 更好的是&lt;element num="1"/&gt;。其次,cityList 中是否包含其他实体?如果没有,那应该很简单——我会更新我的答案。
    • 嗨 Geoff .. 首先:您建议的 正确,但我无法更改。我已经工作了一年:(。第二:是的,它可以包含任何节点名称和任何顺序。
      sdfasdf
    【解决方案2】:

    我自己也遇到了同样的问题,并且对 Geoffs 的回答有一些问题,因为正如他清楚地描述的那样,由于优先级,它限制了在执行查询的其他部分之前返回的元素数量。

    我的解决方案是在应用我的其他条件后添加position() &lt; 10 作为附加条件,例如:

    //ElementsIWant[./ChildElementToFilterOn='ValueToSearchFor'][position() <= 10]/.
    

    请注意,我使用了两个单独的条件块。 这将首先过滤掉符合我条件的元素,其次只取其中的 10 个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2015-12-06
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      相关资源
      最近更新 更多