对于您拥有的 XML 数据,我更喜欢 SimpleXML 扩展,它附带了您需要的一切,而且不需要编写太多代码(它是 DOMDocument 的妹妹)。
所以对于每个customer在输入数据中,您想要获取 9 个左右的值。您可以将这些值表示为 xpath:
$values = <<<XPATH
(
name
|address
|city
|state
|zip
|phone
|buyerinfo/shippingaddress/name
|buyerinfo/shippingaddress/address
|shippingDetail/saletax/saletaxamount
)
XPATH;
这与数据库查询类似。您为 Xpath 语言中的 XML 创建一个包含查询的字符串。
我们对 SQL 做同样的事情,因为两者应该齐头并进,所以这里是相应的 SQL 模式:
$pattern = <<<SQL
INSERT INTO customer
(
name, address, city, state, zip, phone, shipto, shipadderss, tax
)
VALUES
(
'%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
)
SQL;
现在需要的只是打开 XML 并指定要处理的客户元素:
$customers = simplexml_load_string($test)->customer; // "test.xml"
然后,您只需对每个客户进行 foreach,获取值,转义它们,将它们插入到查询中并运行 SQL 查询(或创建一个包含多个记录的更大查询):
foreach ($customers as $customer)
{
$data = $customer->xpath($values);
$escaped = array_map('mysql_real_escape_string', $data);
$query = vsprintf($pattern, $escaped);
// you can now run the query now
// ...
}
是的,这已经是你的代码了。正如您所看到的,利用数组、xpath 和 SQL,您可以极大地简化这一过程。
为了第一customer然后在您的示例 XML 中生成以下查询:
INSERT INTO customer
(
name, address, city, state, zip, phone, shipto, shipadderss, tax
)
VALUES
(
'customer 1','address 1', 'city 1', 'state 1', 'zip 1', 'phone 1', 'ship to', 'Ship address1', '2'
)
整个代码示例:
$values = <<<XPATH
(
name
|address
|city
|state
|zip
|phone
|buyerinfo/shippingaddress/name
|buyerinfo/shippingaddress/address
|shippingDetail/saletax/saletaxamount
)
XPATH;
$pattern = <<<SQL
INSERT INTO customer
(
name, address, city, state, zip, phone, shipto, shipadderss, tax
)
VALUES
(
'%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
)
SQL;
$customers = simplexml_load_string($test)->customer; // "test.xml"
foreach ($customers as $customer)
{
$data = $customer->xpath($values);
$escaped = array_map('mysql_real_escape_string', $data);
$query = vsprintf($pattern, $escaped);
// you can now run the query now
$result = mysql_query($query);
if(mysql_errno())
{
printf(
'<h4 style="color: red;">Query Error:</h4>
<p>(%s) - %s</p>
<p>Query:
<pre>%s</pre>
</p>
<hr />',
mysql_errno(),
htmlspecialchars(mysql_error()),
htmlspecialchars($query)
);
}
}