【问题标题】:Xpath query with PHP (take two values)使用 PHP 进行 Xpath 查询(取两个值)
【发布时间】:2012-03-06 19:11:09
【问题描述】:

这是我正在使用的 XML 代码:

<inventory>
        <drink>
                <lemonade supplier="mother" id="1">
                        <title>Super Lemonade</title>
                        <price>$2.50</price>
                        <amount>20</amount>
                </lemonade>
                <lemonade supplier="mike" id="4">
                        <title>Lemonade Plus</title>
                        <price>$3.00</price>
                        <amount>20</amount>
                </lemonade>
                <pop supplier="store" id="2">
                        <title>Poppys</title>
                        <price>$1.50</price>
                        <amount>10</amount>
                </pop>
        </drink>
</inventory>

然后我编写了一个简单的代码来练习使用 XPath:

<?php
        $xmldoc = new DOMDocument();
        $xmldoc->load('sample.xml');

        $xpathvar = new Domxpath($xmldoc);

        $queryResult = $xpathvar->query('//lemonade/price');
        foreach($queryResult as $result){
                echo $result->textContent;
        }
?>

该代码运行良好,可以按预期输出所有柠檬水的价格值。

现在我需要一个 XPATH 来获取金额 = 20 的所有项目的 TITLE 和 SUPPLIER。

我该怎么做?

谢谢

【问题讨论】:

    标签: php xpath


    【解决方案1】:

    使用

    /*/*/*[amount = 20]/@supplier | /*/*/*[amount = 20]/title 
    

    这个选择

    1. 任何元素的supplier 属性,它是 XML 文档顶部元素的孙子元素(与 /inventory/drink/lemonade 相同,但我喜欢编写更短的 XPath 表达式),其 amount child 有一个可转换为数字 20 的字符串值。

    2. 任何元素的任何title 子元素,它是 XML 文档顶部元素的孙子元素(与 /inventory/drink/lemonade 相同,但我喜欢编写更短的 XPath 表达式),其 amount child 有一个可转换为数字 20 的字符串值。

    基于 XSLT 的验证

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text"/>
    
     <xsl:template match="node()|@*">
         <xsl:for-each select=
         "/*/*/*[amount = 20]/@supplier
        |
          /*/*/*[amount = 20]/title">
    
          <xsl:value-of select="."/>
          <xsl:text>&#xA;</xsl:text>
         </xsl:for-each>
     </xsl:template>
    </xsl:stylesheet>
    

    当此转换应用于提供的 XML 文档时

    <inventory>
        <drink>
            <lemonade supplier="mother" id="1">
                <title>Super Lemonade</title>
                <price>$2.50</price>
                <amount>20</amount>
            </lemonade>
            <lemonade supplier="mike" id="4">
                <title>Lemonade Plus</title>
                <price>$3.00</price>
                <amount>20</amount>
            </lemonade>
            <pop supplier="store" id="2">
                <title>Poppys</title>
                <price>$1.50</price>
                <amount>10</amount>
            </pop>
        </drink>
    </inventory>
    

    它计算 XPath 表达式并将所选模式的值复制到不同的行

    mother
    Super Lemonade
    mike
    Lemonade Plus
    

    请注意

    使用 the XPath Visualizer 之类的工具可以极大地帮助您学习 XPath - 成千上万的人使用该工具以有趣的方式学习 XPath。

    【讨论】:

    • 但是加入 |只需给我 2 个标题值和 2 个供应商值...我想要 2 个带有标题+供应商的“数组”!
    • @user311188:评估单个 XPath 表达式总是最多产生一个节点集。如果您想获得两个不同的节点集,则必须计算两个不同的 XPath 表达式——一个用于您需要的两个节点集中的每一个。另外,在您的问题中,您没有提到这样的要求。
    • Dimitre ... 如果一个表达式给出 5 个结果,而其他 4 个结果怎么办?我怎样才能把它们结合起来?
    • @user311188:取决于“组合”的含义。在 XPath 中,可以使用不同的运算符组合表达式:联合运算符 |、使用 orand 运算符以及 not() 函数等。如果这些还不够,那么可以在承载 XPath 的编程语言(例如 XSLT、XQuery、C#、Java...)中处理由这些 XPath 表达式选择的节点集。
    • Dimitre... 我找不到解决方案 :( 我将向您展示我的真实示例:pastebin.com/vYQ1i7Kv 这是一个 Google Docs 可用文档 XML,连接文件夹和文档以及它们的树.我需要的是一个给我文件夹树的结果。你能帮我吗?我有这个:/*/*/d:category[ contains(@label,"folder") ]/../d:title | /*/*/d:category[ contains(@label,"folder") ]/../d:link[ contains(@rel,"parent") ]/@title 但是这个组合是我需要的单个数组 ...
    【解决方案2】:

    一般而言,您希望使用直接路径而不是 // 搜索,因为它更快:

    /inventory/drink/lemonade[amount=20]/title
    

    /inventory/drink/lemonade[amount=20]/@supplier
    

    您可以将这两个 XPath 查询与 | (UNION) 运算符结合起来,然后返回四个节点。

    使用 DOM 以编程方式访问属性的说明如下:

    您可以在

    找到一个很好的 XPath 教程

    【讨论】:

    • 但是加入 |只需给我 2 个标题值和 2 个供应商值...我想要 2 个带有标题+供应商的“数组”!
    猜你喜欢
    • 2010-09-18
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2010-11-21
    • 2022-01-15
    相关资源
    最近更新 更多