读取并获取XML属性的值

时间:2013-07-08 18:12:10

标签: php xml

我有这个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-&gt; image1 =(pohoto 1的attibutes中的文件名),图像2,3等的相同内容。

谢谢。

3 个答案:

答案 0 :(得分: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的扩展名,而不是使用普通的MySimpleXMLElement。它根据输入参数在内部运行XPath查询,并基于它操作的父元素(这里是Photo元素):

/**
 * 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() was already in use)。所以玩得开心。

当然你也可以这样写:

$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是在answer to the "simplexml_load_file - redundant element with empty value is converted to new SimpleXMLElement Object" question中。

答案 1 :(得分: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/>";
    }
    ?>

答案 2 :(得分: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