使用PHP进行Xpath查询(取两个值)

时间:2012-02-15 12:33:23

标签: php xpath

这是我正在使用的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。

我该怎么做?

谢谢

2 个答案:

答案 0 :(得分:4)

通常,您希望在//搜索上使用直接路径,因为它更快:

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

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

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

使用DOM编程访问属性的解释如下:

您可以在

找到一个好的XPath教程

答案 1 :(得分:1)

使用

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

选择

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

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

  3. 基于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的有趣方式。