Php simplexml加载文件中的循环

Php simplexml加载文件中的循环,php,xml,simplexml,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

我正在使用下面的代码将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)."','" ...

?>

有没有办法让这一切自动化?我的意思是,PHP代码应该能够预测参数,并使用循环将mysql_real_escape_字符串($sales->NEW1)生成为新的10个值。

使用动态变量
$var
可能类似于此

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

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

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

我希望这就是你要找的

$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 >';
    }
}
$string='1!'
新1
新2
新3
新4
新5
新6
新11
新22
新33
'; 
$sxe=simplexml\u load\u string($string);
foreach($sxe->AUTHAD as$sales){
如果(计数($sales)>0){
$values=array();
foreach($key=>$sale的销售额){
$values[]=“'”。mysql\u real\u escape\u string($sale)。“;
}
$authadv_new=“插入test.authad值(“.join(',',$values)。”);
echo$authdv_new.“
”; } }
我希望这就是您要找的

$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 >';
    }
}
$string='1!'
新1
新2
新3
新4
新5
新6
新11
新22
新33
'; 
$sxe=simplexml\u load\u string($string);
foreach($sxe->AUTHAD as$sales){
如果(计数($sales)>0){
$values=array();
foreach($key=>$sale的销售额){
$values[]=“'”。mysql\u real\u escape\u string($sale)。“;
}
$authadv_new=“插入test.authad值(“.join(',',$values)。”);
echo$authdv_new.“
”; } }
如果您不关心每个XML之间的数据顺序,您只需对对象进行内爆,而不是每次都选择特定的值。进行内爆也可以避免循环


插入test.authad值(“.”。内爆(“,”,mysql\u real\u escape\u string($sxe->authad))。“)

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


插入test.authad值(“.”。内爆(“,”,mysql\u real\u escape\u string($sxe->authad))。“)

虽然satrun77的示例运行良好,但您可以使用少量代码,并通过使用其“children()”方法来保持simplexml对象的优点:


虽然satrun77的示例运行良好,但您可以使用少量代码,并通过使用simplexml对象的“children()”方法保持其优点:


您正在寻找迭代对象成员的
get\u object\u 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;

您正在寻找迭代对象成员的
get\u object\u 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;

它已经创建了10个空格,比如“NEW1”、“NEW2”等等,这些值是您要查找的值吗?如果不是,ofc是否需要修改脚本?(假设您在执行之前将simplexml_load_文件内容粘贴到脚本中:)它创建了10个空格,如“NEW1”、“NEW2”等,您要查找的值是否真的命名为NEW1、NEW2等?如果不是,ofc是否需要修改脚本?(假设您在执行之前将simplexml_load_文件内容粘贴到脚本中,当然:))NEW1、NEW2、NEW3可以是任何东西!我不知道。我希望代码能找到答案。你能举一个XML的例子吗(有结构)?这段代码很难看,不可读。至少使用sprintf()$authad=sprintf('insert into`test`.`authad`values(“%s”、“%s”、“%s”)、mysql\u real\u escape\u string($sales->LOCALDATE)、mysql\u real\u escape\u string($sales->LOCALTIME)、mysql\u real\u escape\u string($sales->TLOGID));新1,新2,新3可以是任何东西!我不知道。我希望代码能找到答案。你能举一个XML的例子吗(有结构)?这段代码很难看,不可读。至少使用sprintf()$authad=sprintf('insert into`test`.`authad`values(“%s”、“%s”、“%s”)、mysql\u real\u escape\u string($sales->LOCALDATE)、mysql\u real\u escape\u string($sales->LOCALTIME)、mysql\u real\u escape\u string($sales->TLOGID));有多个文件需要处理,由satrun77代码生成的insert into tbl语句按预期工作。在您的情况下,代码适用于第一个文件。然后,它为第二个文件之后的所有数据生成一个insert into语句,该语句由于明显的原因而失败。您是说该代码是连续遍历多个文件的更大循环的一部分吗?如果是这样,那么我的代码就会失败,因为我没有像上面satrun77那样初始化foreach子循环中的$children数组(但不要怪我……我不明白您是如何处理多个文件的)。如果在第一个foreach循环中添加“$children=array();”作为第一条语句,那么它也应该可以工作。但正如我所说,这只是完成同一件事的不同策略;satrun77使用对象作为键/值对,我使用children()方法。。。这两个都应该满足您的需要。有多个文件需要处理,由satrun77代码生成的insert into tbl语句按预期工作。在您的情况下,代码适用于第一个文件。然后,它为第二个文件之后的所有数据生成一个insert into语句,该语句由于明显的原因而失败。您是说该代码是连续遍历多个文件的更大循环的一部分吗?如果是这样,那么我的代码就会失败,因为我没有像上面satrun77那样初始化foreach子循环中的$children数组(但不要怪我……我不明白您是如何处理多个文件的)。如果在第一个foreach循环中添加“$children=array();”作为第一条语句,那么它也应该可以工作。但正如我所说,这只是完成同一件事的不同策略;satrun77使用对象作为键/值对,我使用children()方法。。。两者都应该满足你的需要
insert into test.authad values ('one', 'two\':-)', 'three;\"\'')