在simplexml加载文件中循环

时间:2011-03-11 08:25:47

标签: php xml simplexml

我正在使用以下代码将XML数据解析为MySQL表,并且它正在按预期工作。

<?php
$sxe = simplexml_load_file("$myfile");
foreach($sxe->AUTHAD as $sales) {

$authad="insert into test.authad values ('".mysql_real_escape_string($sales->LOCALDATE)."','".mysql_real_escape_string($sales->LOCALTIME)."','".mysql_real_escape_string($sales->TLOGID)."','" ...

?>

问题是,当我得到一个不同格式的新xml文件时,我不能使用上面的insert into语句,必须手动更改参数。例如,

$authadv_new="insert into test.authad values ('".mysql_real_escape_string($sales->NEW1)."','".mysql_real_escape_string($sales->NEW2)."','".mysql_real_escape_string($sales->NEW3)."','" ...

有没有办法实现自动化?我的意思是PHP代码应该能够预测参数并使用循环生成mysql_real_escape_string($ sales-&gt; NEW1)到NEW10值。

5 个答案:

答案 0 :(得分:1)

使用动态变量$var可能是这样的吗?

<?php
$values = array();
for($i = 1; $i < 11; $i++) {
    $var = "NEW".$i;
    $values[] = "'".mysql_real_escape_string($sales->$var)."'";
}
$string = join(",", $values);

答案 1 :(得分:1)

我希望这就是你要找的东西?

$string = '<?xml version="1.0" encoding="UTF-8" ?> 
<root>
   <AUTHAD>
      <NEW1>New 1</NEW1>
      <NEW2>New 2</NEW2>
      <NEW3>New 3</NEW3>
      <NEW4>New 4</NEW4>
      <NEW5>New 5</NEW5>
      <NEW6>New 6</NEW6>
   </AUTHAD>
   <AUTHAD>
      <NEW1>New 11</NEW1>
      <NEW2>New 22</NEW2>
      <NEW3>New 33</NEW3>
   </AUTHAD>
</root>
'; 

$sxe = simplexml_load_string($string);
foreach($sxe->AUTHAD as $sales) {
    if (count($sales) > 0) {
        $values = array();
        foreach($sales as $key => $sale) {
            $values[] = "'" . mysql_real_escape_string($sale) . "'";
        }
        $authadv_new="insert into test.authad values (" . join(', ', $values) . ")";
        echo $authadv_new.'<br >';
    }
}

答案 2 :(得分:1)

虽然satrun77的示例工作正常,但您可以使用稍微少的代码并通过使用其“children()”方法来坚持simplexml对象的优点:

$sxe = simplexml_load_string($xml);
foreach($sxe->AUTHAD as $sales) {
        foreach ($sales->children() as $child) {
                $children[]="'".mysql_real_escape_string($child)."'";
        }
        $authad="insert into test.authad values (".implode($children,",").");";
}

答案 3 :(得分:1)

您正在寻找get_object_vars()来迭代对象成员:

<?php

mysql_connect( 'localhost', 'root', 'moin' );

$sxe = simplexml_load_file( $argv[1] );
var_dump( $sxe );

$sql = "insert into test.authad values (";

foreach($sxe->AUTHAD as $sales) {
    $members = get_object_vars( $sales );
    $values = array();
    foreach ( $members as $name => $value ) {
        echo "$name : $value\n";
        $values[] = "'" . mysql_real_escape_string( $value ) . "'";
    }
    $sql .= join( $values, ', ' );
}

$sql .= ")\n";
echo $sql;

输入是这个文件:

<sxe>
    <AUTHAD>
        <eins>one</eins>
        <zwei>two':-)</zwei>
        <drei>three;"'</drei>
    </AUTHAD>
</sxe>

我在这里得到以下结果:

insert into test.authad values ('one', 'two\':-)', 'three;\"\'')

答案 4 :(得分:0)

如果您不关心每个XML之间的数据顺序,您可以直接破坏对象,而不是每次都选择特定的值。进行内爆也可以避免循环。

INSERT INTO test.authad VALUES('".implode("','", mysql_real_escape_string($sxe->AUTHAD))."')