Voor de XML-gegevens die je hebt, heb ik liever de SimpleXML-extensie, deze wordt geleverd met alles wat je nodig hebt en het is niet zo veel code om te schrijven (het is het kleine zusje van DOMDocument).
Dus voor elke klant in de invoergegevens wilt u uw ongeveer 9 waarden ophalen. Je kunt die waarden formuleren als een xpath:
$values = <<<XPATH
(
name
|address
|city
|state
|zip
|phone
|buyerinfo/shippingaddress/name
|buyerinfo/shippingaddress/address
|shippingDetail/saletax/saletaxamount
)
XPATH;
Dit werkt hetzelfde als bij een databasequery. U maakt een tekenreeks die de query bevat, voor XML in de Xpath-taal.
En we doen hetzelfde voor SQL, aangezien beide hand in hand zouden moeten gaan, dus hier is het overeenkomstige SQL-patroon:
$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;
Het enige wat nu nodig is, is het openen van de XML en het specificeren van de klantelementen om aan te werken:
$customers = simplexml_load_string($test)->customer; // "test.xml"
Dan hoef je alleen maar elke klant te doorzoeken, de waarden te verkrijgen, ze te escapen, ze in de query in te voegen en de SQL-query uit te voeren (of maak een grotere query met meer dan één record):
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
// ...
}
Ja, dat is je code al. Zoals u kunt zien, kunt u dit aanzienlijk vereenvoudigen door gebruik te maken van arrays, xpath en SQL.
Voor de eerste klant in uw voorbeeld-XML genereert dit dan de volgende query:
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'
)
Het hele codevoorbeeld:
$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)
);
}
}
', mysql_errno(), htmlspecialchars(mysql_error()), htmlspecialchars($query) ); }}