“ simplexml” php至mysql数据库循环仅返回第一个元素

时间:2018-08-06 20:00:27

标签: php mysql xml loops foreach

感谢您对此提供的帮助。我有一个非常长的xml表单,其中有80多个项目要插入到我的数据库中。

我已经对此进行了研究,由于某种原因,我的foreach循环无法正常工作。

我在此处减少了插入内容,以使我对我想做的事情有所了解。

我可以将第一个“属性/项目”插入数据库,所以我知道插入没有问题。

由于某种原因,循环不会在数据库中显示其他79个项目。

$affectedRow = 0;

$xml =  simplexml_load_file('properties2.xml') or die("can not find it");

foreach($xml->children()  as $row) {    
    $reference = $row->branch->properties->property['reference'];
    $instructedDate = $row->branch->properties->property->instructedDate;
    $price_text = $row->branch->properties->property->price_text;

    $sql = "INSERT INTO test( reference, instructedDate, price_text) VALUES ('". $reference ."','". $instructedDate ."','". $price_text ."')";

    $result = mysqli_query($conn, $sql);

    if (! empty($result )) {
        $affectedRow ++;
    } else {
        $error_message = mysqli_error($conn) . "\n";
    }
}
?>

例如xml文件

-<agency branchName="billies Estate Agents " name="billie ea" xsi:noNamespaceSchemaLocation="http://www.feedcompany.co.uk/xmlexport/feedcompanyXMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    -<branches>

        -<branch name="billies Estate Agents ">

            -<properties>

                -<property reference="00000477">

                    <instructedDate>26/02/2018 15:11:56</instructedDate>

                    <price_text>Offers in Excess of £200,000</price_text>

                 </property

               -<property reference="00000478">

                    <instructedDate>26/02/2018 15:11:56</instructedDate>

                    <price_text>Offers in Excess of £200,000</price_text>

                </property>

1 个答案:

答案 0 :(得分:1)

您只会将第一个元素放入数据库,因为$xml->children()不是您所期望的。

请注意,您的XML以<agency>开头,之后带有<branches>标记。我想您的完整XML是这样的:

<agency>
    <branches>
        <branch>
            <properties>
                <property>
                    ...
                </property>
                <property>
                    ...
                </property>
            </properties>
        </branch> 
    </branches>
</agency>

您要获取所有属性->,因此需要使用$xml->branches->branch->properties->children()

类似:

foreach($xml->branches->branch->properties->children() as $property) {
    $sql = "INSERT INTO test( reference, instructedDate, price_text) VALUES ('". $property['reference']."','". $property->instructedDate ."','". $property->price_text."')";
 ...
 } 

当您在第三行执行$xml->children()时,您将把branchs标签作为数组中的唯一元素-这就是为什么只有一个元素插入数据库的原因。