如何使用PHP从XML获取标记的属性?

时间:2014-12-30 00:30:34

标签: php mysql xml

我有以下XML和代码,我尝试将其保存在mySQL中。它工作正常但我的问题是我无法获得产品ID属性。

SQLSTATE [23000]:完整性约束违规:1048列' product_id'不能为空

<product id="1111845">
  <name><![CDATA[MadBiker 600]]></name>
  <link>http://demo.com/p.MadBiker-600.1111845.html</link>
  <price_with_vat>107.01</price_with_vat>
...
...
...
</product>

这是代码

$xml = simplexml_load_file("demo.xml");

   foreach($xml->products->product as $data) {
        $sql = "INSERT INTO products (shop, product_id, name, price, shipping, manufacturer, stock, availability)
            VALUES (:SHOP, :ID, :NAME, :PRICE, :SHIPPING, :MANUFACTURER, :STOCK, :AVAILABILITY)";
        $stmt = $dbh->prepare($sql);

            "ID" => $data->product[id] ,
            "NAME" => $data->name,
            "PRICE" => $data->price_with_vat,

怎么做?

3 个答案:

答案 0 :(得分:1)

您的foreach循环已遍历<product>个节点:

foreach ($xml->products->product as $data) {
  //...
}

因此,在这种情况下,$data已经代表<product>,您不想使用$data->product。然后,只需在['id']本身上通过数组键引用$data属性即可:

"ID" => (string)$data['id']

(不要忘记将其强制转换为字符串 - 其他节点需要通过(string)进行相同的处理)

"NAME" => (string)$data->name,
"PRICE" => (string)$data->price_with_vat,

PHP没有显示其他警告的事实表明您没有display_errors。始终在开发代码时,请使用

error_reporting(E_ALL);
ini_set('display_errors', 1);

或者在php.ini中设置它们。

答案 1 :(得分:0)

尝试(int)$data->product['id'],您需要在使用SimpleXML时投射属性。

答案 2 :(得分:-1)

而不是使用

$data->product['id'], 
$data->name,
$data->price_with_vat,

使用

$data['product'][0]
$data['name']
$data['price_with_vat']

http://php.net/manual/en/simplexmlelement.attributes.php