Pour les données XML que vous avez, je préférerais l'extension SimpleXML, elle est livrée avec tout ce dont vous avez besoin et ce n'est pas beaucoup de code à écrire (c'est la petite sœur de DOMDocument).
Donc pour chaque client dans les données d'entrée, vous souhaitez récupérer vos 9 valeurs environ. Vous pouvez formuler ces valeurs sous forme de xpath :
$values = <<<XPATH
(
name
|address
|city
|state
|zip
|phone
|buyerinfo/shippingaddress/name
|buyerinfo/shippingaddress/address
|shippingDetail/saletax/saletaxamount
)
XPATH;
Cela fonctionne comme avec une requête de base de données. Vous créez une chaîne qui contient la requête, pour XML dans le langage Xpath.
Et nous faisons la même chose pour SQL car les deux doivent aller de pair, voici donc le modèle SQL correspondant :
$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;
Il suffit maintenant d'ouvrir le XML et de spécifier les éléments client sur lesquels travailler :
$customers = simplexml_load_string($test)->customer; // "test.xml"
Ensuite, il vous suffit de parcourir chaque client, d'obtenir les valeurs, de les échapper, de les insérer dans la requête et d'exécuter la requête SQL (ou de créer une requête plus longue contenant plusieurs enregistrements) :
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
// ...
}
Oui, c'est déjà votre code. Comme vous pouvez le voir, en utilisant des tableaux, xpath et SQL, vous pouvez grandement simplifier cela.
Pour le premier client dans votre exemple de XML, cela génère alors la requête suivante :
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'
)
L'exemple de code entier :
$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) ); }}