1

我试图访问我的 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 />';

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

4

2 回答 2

1

我在您的 XML 中看不到任何名称空间。无论如何,完成您想要的最简单/最短的方法是使用 XPath。这是一个解决方案

<?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
于 2013-07-29T20:24:34.470 回答
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
参见 php.net 上的手册

如果您知道要访问的属性的名称,请按照Rolando Isidoro在您问题的另一个答案中xpath所示的方式使用。

于 2013-07-29T20:25:48.230 回答