我正在使用以下代码将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值。
答案 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))."')