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


How to get the attribute of a tag from XML using PHP?

我有以下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,

怎么做?

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

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

所以在这种情况下,$data已经表示<product>,你不想使用 $data->product . 那么只需在$data本身上通过数组键引用 ['id'] 属性即可:

"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。

尝试(int)$data->product['id'],在使用 SimpleXML 时需要强制转换属性。

而不是使用

$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