XML命名空间不起作用

时间:2013-07-29 18:17:58

标签: php xml simplexml

我试图访问我的XML元素,我可以检索我的数据,但不能检索命名空间值。 我正在尝试检索fromPrice值的值(24.95)有人可以帮助我吗?

<?xml version="1.0" encoding="utf-8"?>
<products>
<product ID="14">
<name>Productname</name>
<price currency="EUR">9.95</price>
<URL>http://www.google.com</URL>
<images>
<image>image.jpg</image>
</images>
<description><![CDATA[<p>long description</p>]]></description>
<categories/>
<properties>
<property name="brand">
<value>Brandname</value>
</property>
<property name="deliveryTime">
<value>1 - 3 days</value>
</property>
<property name="fromPrice">
<value>24.95</value>
</property>
<property name="EAN">
<value>12345</value>
</property>
<property name="sku">
<value></value>
</property>
<property name="shipping_costs">
<value>6.95</value>
</property>
</properties>
<variations/>
</product>
</products>
<!-- Total number of products: 1 -->

我尝试使用simpleXML和PHP访问我的数据:

$data = simplexml_load_file("cache/file.xml");
if (!$data){die();}
else{
foreach($data->product as $record )
{
//Use that namespace
$namespaces = $record->properties->getNameSpaces(true);
$dc = $record->properties->children($namespaces['property']); 
$priceold = $dc->fromPrice;
}
}
echo 'priceold: '.$priceold.'<br />';

但这不起作用:(有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我在XML中看不到任何名称空间。无论如何,实现你想要的最简单/最短的方法是使用XPath。这是一个solution

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<products>
    <product ID="14">
        <name>Productname</name>
        <price currency="EUR">9.95</price>
        <URL>http://www.google.com</URL>
        <images>
            <image>image.jpg</image>
        </images>
        <description><![CDATA[<p>long description</p>]]></description>
        <categories />
        <properties>
            <property name="brand">
                <value>Brandname</value>
            </property>
            <property name="deliveryTime">
                <value>1 - 3 days</value>
            </property>
            <property name="fromPrice">
                <value>24.95</value>
            </property>
            <property name="EAN">
                <value>12345</value>
            </property>
            <property name="sku">
                <value />
            </property>
            <property name="shipping_costs">
                <value>6.95</value>
            </property>
        </properties>
        <variations />
    </product>
</products>
XML;

$sxe   = new SimpleXMLElement($xml);
$value = current($sxe->xpath('//property[@name="fromPrice"]/value'));

echo $value;

输出:

24.95

答案 1 :(得分:0)

您的XML中没有名称空间。我假设您的意思是name节点的<property>属性:

<property name="fromPrice">

要访问知道名称的属性,请使用attributes()

$xml = simplexml_load_string($x); // assume XML in $x
$properties = $xml->xpath("//property");
foreach ($properties as $property) {
    foreach($property->attributes() as $a => $b)
        echo $a,'="',$b,"\"\n";
}

此代码将...
(1)选择所有<property>个节点(xpath)和
(2)打印出每个节点的属性名称和值

看到这个有效:http://3v4l.org/Rkuqf
see the manual on php.net

如果您知道要访问的属性的名称,请在问题的另一个答案中使用 Rolando Isidoro 所示的xpath。< / p>