【问题标题】:How to get the last child of each cd element?如何获取每个 cd 元素的最后一个子元素?
【发布时间】:2017-10-20 13:07:26
【问题描述】:

XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd country="USA">
        <disk>
            <title>Empire Burlesque</title>
            <artist>Bob Dylan</artist>
            <price>10.90</price>
        </disk>
        <disk>
            <title>Hide your heart</title>
            <artist>Bonnie Tyler</artist>
            <price>9.90</price>
        </disk>
        <disk>
            <title>KDGFJDLF</title>
            <artist>mnxc  lxck</artist>
            <price>7.20</price>
        </disk>
    </cd>
    <cd country="USA">
        <disk>
            <title>Greatest Hits</title>
            <artist>Dolly Parton</artist>
            <price>12.90</price>
        </disk>
        <disk>
            <title>ASD</title>
            <artist>abc def</artist>
            <price>12.30</price>
        </disk>
    </cd>
</catalog>

我需要获取每张 cd 的最后一个孩子和倒数第二个孩子(价格)。

所以第一张 CD 的结果是: 最后一个孩子(磁盘 3):7.20 &倒数第二个孩子(磁盘 2):9.90

第二张CD的结果是: 最后一个孩子(磁盘 2):12.30 &倒数第二个孩子(磁盘 1):12.90

只需要价格

我可以知道其中一张 cd 的价格,但我无法获得每张 cd 的价格(如果添加了新的)。

<?php
$xml = new DOMDocument();
$xml->load(realpath('cd.xml'));
$xpath = new DOMXPath($xml);

$asd = $xml ->getElementsByTagName( "cd" ); 
$qwe = $xpath ->query('//catalog/cd');

foreach ($qwe as $qwe) {
$lastPrice = $xpath->query('//catalog/cd /disk[last()]/price')->item(0)->nodeValue;
$secondLastPrice = $xPath->query('//catalog/cd /disk[last()-1]/price')->item(0)->nodeValue;
}
?>

我如何从 $qwe 继续。获取每张 cd 的最后价格和倒数第二个价格?

【问题讨论】:

    标签: php xml xpath domdocument domxpath


    【解决方案1】:

    您可以创建一个 xpath 表达式,它从 cd 中选择最后两个元素并返回它们。如果你只想要价格,你也可以附加它。

    //catalog/cd/disk[position()>last()-2]/price
    

    【讨论】:

    • 如果目录包含不同的内容,则可能是 xml 设计问题。然而,每个磁盘应该有相同的标签
    • 在 foreach ($qwe as $qwe) 循环中,我为每个打印最后价格的循环制作了另一个,但是我现在如何获得第二个最后价格,哈哈。 $lastP = $xPath->query('//customerInfos/customer/meter/meterDate[last()]'); foreach ($lastP as $n) { $lastPrice = $n->nodeValue; }
    • @Marvelo 而不是 [last()] 你应该使用 [position()&gt;last()-2] - 这给了你最后两个元素
    • @Philipp 抱歉,我刚刚修复了 xml
    • @Philipp 我需要 2 个变量中的这 2 个值。另一个 for 循环会起作用吗?
    【解决方案2】:

    获取cd 中所有以disk 开头、lastlast -1 位置的节点的价格

    //cd/*[starts-with(name(),'disk')][position() > last()-2]/price
    

    或者如果您需要保留目录:

    //catalog/cd/*[starts-with(name(),'disk')][position() > last()-2]/price
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2014-03-11
      相关资源
      最近更新 更多