2011-03-11 65 views
0

我正在使用以下代碼將XML數據解析到MySQL表,並且它按預期工作。在simplexml加載文件中循環

<?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-> NEW1)爲NEW10值。

+0

NEW1,NEW2,NEW3可以是任何東西!我不知道。我想要代碼找出它。 – shantanuo 2011-03-11 08:57:36

+0

你可以把你的XML的例子(有結構)嗎? – Akarun 2011-03-15 10:50:15

+0

這段代碼很難看,也很難讀。至少使用sprintf()。 ** $ authad = sprintf('insert into \'test \'。\'authad \'values(「%s」,「%s」,「%s」)', mysql_real_escape_string($ sales-> LOCALDATE) , mysql_real_escape_string($ sales-> LOCALTIME), mysql_real_escape_string($ sales-> TLOGID)); ** – Carpetsmoker 2011-03-16 00:14:11

回答

1

雖然satrun77的例子正常工作,您可以使用它的「兒童()」使用略少的代碼和堅持的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,",").");"; 
} 
+0

有多個文件需要處理,插入到由satrun77代碼生成的tbl語句中,如預期那樣工作。在你的情況下,代碼適用於第一個文件。然後,它會爲第二個文件之後的所有數據生成一個插入語句的聲明,這顯然會失敗。 – shantanuo 2011-03-16 11:52:34

+0

你是說這段代碼是一個更大的循環的一部分,這個循環連續地通過許多文件?如果是這樣,那麼我的代碼失敗,因爲我沒有初始化我的foreach子循環中的$ children數組,如satrun77所做的那樣(但不要怪我......我不明白你是如何處理多個文件的)。如果你添加「$ children = array();」作爲第一個foreach循環中的第一條語句,它也應該可以工作。但正如我所說,這是完成同樣事情的不同策略; satrun77使用對象作爲鍵/值對,我使用children()方法......都應該滿足您的需求 – jlmcdonald 2011-03-18 20:39:00

1

也許這樣使用動態變量$var

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

它創建了10個空格,如#,'','','','','','' '','','','' – shantanuo 2011-03-11 08:55:52

+0

您正在查找的值是否真的名爲NEW1,NEW2等?如果不是,你會需要修改腳本嗎? (假設你在執行之前將你的simplexml_load_file填充到腳本中:)) – edorian 2011-03-11 08:57:18

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 >'; 
    } 
} 
0

如果您不關心每個XML之間的數據順序,那麼您可以將對象內爆,而不是每次都挑出特定的值。做一個內爆也可以讓你避免循環。

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

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;\"\'')