在PHP中解析非标准XML文档的最有效方法

时间:2013-08-15 14:00:58

标签: php xml xml-parsing

在PHP中,解析格式如下的XML文档的最快,最有效的方法是什么:

<data>
    <rowdata>
        <fieldname>products_id</fieldname>
        <value><![CDATA[1]]></value>
        <fieldname>products_image</fieldname>
        <value><![CDATA[image_one.jpg]]></value>
        <fieldname>products_name</fieldname>
        <value>Product One</value>
    </rowdata>
    <rowdata>
        <fieldname>products_id</fieldname>
        <value><![CDATA[2]]></value>
        <fieldname>products_image</fieldname>
        <value><![CDATA[image_two.jpg]]></value>
        <fieldname>products_name</fieldname>
        <value>Product Two</value>
    </rowdata>
</data>

这是我为直播系统公司提供的将产品导入数据库的格式。我不知道为什么他们决定使用<fieldname><value>代码,而不只是<products_id>1</products_id>

目前,我能想到的唯一方法是编写一些粗略的循环,每次找到<value>标记时都会设置一个布尔值并重置

1 个答案:

答案 0 :(得分:1)

看起来很简单。有一些逻辑 - 每个<fieldname>有一个<value> - 我假设每个字段名对应一个表中的一列。

使用simplexml

$xml='<data>
    <rowdata>
        <fieldname>products_id</fieldname>
        <value><![CDATA[1]]></value>
        <fieldname>products_image</fieldname>
        <value><![CDATA[image_one.jpg]]></value>
        <fieldname>products_name</fieldname>
        <value>Product One</value>
    </rowdata>
    <rowdata>
        <fieldname>products_id</fieldname>
        <value><![CDATA[2]]></value>
        <fieldname>products_image</fieldname>
        <value><![CDATA[image_two.jpg]]></value>
        <fieldname>products_name</fieldname>
        <value>Product Two</value>
    </rowdata>
</data>';

$data = simplexml_load_string($xml);
$baseSQL='INSERT into TABLE set ';

foreach($data as $rowdata) {
    $SQL='';
    $count=0;
    foreach ($rowdata->fieldname as $fieldname) {
        if ($SQL!='') $SQL.=',';
        $SQL.=$fieldname.'="'.$rowdata->value[$count].'"';
        $count++;
    }
    echo $baseSQL.$SQL.'<br>';
}

产生:

INSERT into TABLE set products_id="1",products_image="image_one.jpg",products_name="Product One"
INSERT into TABLE set products_id="2",products_image="image_two.jpg",products_name="Product Two"