0

我有这个 XML 问题的股票,我有一个 XML 文件,我可以浏览它来查找值。一切正常,我可以阅读所有子节点,但我被困在这一部分。包含照片的XML部分都是节点的同名,除了一个属性,如何指定如何根据这个浏览并取每个的文件名值

XML 
...
<Engine>
            <Fuel>Unleaded</Fuel>
            <Cylinders>4</Cylinders>
            <Induction>Normally aspirated</Induction>
          </Engine>
          <Photo order="1">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg</Filename>
          </Photo>
          <Photo order="2">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_3.jpg</Filename>
          </Photo>
          <Photo order="3">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_4.jpg</Filename>
          </Photo>
          <Photo order="4">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_5.jpg</Filename>
          </Photo>
          <Photo order="5">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_6.jpg</Filename>

...

在我的 php 文件中,我有这段代码可以帮助我找到值:

$import->stock_no =(string)$item->Invoice->Vehicle->VehicleStock;           

$import->image1 =(string)$item->Invoice->Vehicle->Photo->attributes(order="1")->Filename; 

当然不行,如何浏览所有照片节点(我有8张图片需要从中取值)

我想要 $import->image1 =(pohoto 1 的属性中的文件名),图像 2、3 等的相同。

谢谢你。

4

3 回答 3

1

您尝试实现的目标(首先)可以通过使用 xpath 查询来实现。您想根据属性值访问子节点。SimpleXML 中更好的参考问题是:

这也是从某些日子开始,有人建议扩展表单SimpleXMLElement以提供实用功能,以便通过简单的界面实际做到这一点:

但是,由于您建议的语法,您的情况有些不同:

$xml = simplexml_load_string($buffer, 'MySimpleXMLElement');

echo $xml->Vehicle->Photo->attribute("order", "1")->Filename;

// prints "http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg"

这个例子没有使用普通的,而是使用SimpleXMLElement了一个名为 (exemplary) 的扩展MySimpleXMLElement。它根据输入参数和它所操作的父元素(这里是一个Photo元素)在内部运行 XPath 查询:

/**
 * Class MySimpleXMLElement
 *
 * Example of how to magically access named child-nodes based
 * on an attribute value of theirs.
 */
class MySimpleXMLElement extends SimpleXMLElement
{
    public function attribute($name, $value) {

        $nodes = $this->xpath(
            sprintf('../%s[@%s = "%s"]', $this->getName(), $name, $value)
        );

        return $nodes ? $nodes[0] : NULL;
    }
}

这种新MySimpleXMLElement::attribute()方法(对不起attributes(),已经在使用了)然后在每个节点上都可用。所以玩得开心。

自然也可以这样写:

$xml = simplexml_load_string($buffer);

echo $xml->Vehicle->xpath('Photo[@order="1"]')[0]->Filename;

// prints "http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg"

扩展的 SimpleXMLElement 主要是出于方便的原因。如果您还不熟悉 Xpath,它可能更容易调试。

上次我在 Stackoverflow 上扩展 SimpleXMLElement 是在“simplexml_load_file - 具有空值的冗余元素转换为新的 SimpleXMLElement 对象”问题的上述答案中

于 2013-07-08T19:42:01.527 回答
0

尝试这个

    <?php
    $xml = '<Engine>
                <Fuel>Unleaded</Fuel>
                <Cylinders>4</Cylinders>
                <Induction>Normally aspirated</Induction>
            </Engine>
            <Photo order="1">
                <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg</Filename>
              </Photo>
              <Photo order="2">
                <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_3.jpg</Filename>
              </Photo>';

    $xml="<Wraper>".$xml."</Wraper>";
    $parse=new SimpleXMLElement($xml);

    echo "Engine Fuel:".$parse->Engine->Fuel;
    echo "<br/>Engine Cylinders:".$parse->Engine->Cylinders;
    echo "Photos<br/>";
    foreach ($parse->Photo as $photo)
    {

        echo "<br/>Photo Order: ".$photo->attributes();
        echo "<br/>Photo URL: ".$photo->Filename;
        echo "<hr/>";
    }
    ?>
于 2013-07-08T18:41:09.523 回答
0

甜美简单xpath

$xml = simplexml_load_string($x); // assume XML in $x

$photos = $xml->xpath("//Photo"); // select all Photo nodes and their children in an array

foreach ($photos as $photo)
    echo "order: $photo[order], file: $photo->Filename<br />"; // simple output

看到它工作:http: //3v4l.org/SJmEg

于 2013-07-08T19:48:36.193 回答