2009-07-10 9 views
0

Voici une forme simple j'utilise pour envoyer des données XML dans admin_xml.phpComment améliorer le code suivant dans PHP

<form name="review" action="admin_xml.php" method="post"> 
<textarea name="xml" cols="40" rows="10"></textarea> 
<input class="submit" type="submit" value="Submit Request"> 
</form> 

Voici le XML que je rentre pour récupérer les données de MySQL Database

<?xml version="1.0" encoding="UTF-8"?> 
<GetOrdersIds> 
    <Credentials> 
     <Username>my_username</Username> 
     <Password>my_password</Password> 
    </Credentials> 
    <Criterions> 
     <OrderNumber></OrderNumber> 
     <StartDate>2009-01-01</StartDate> 
     <EndDate>2009-07-01</EndDate> 
    </Criterions> 
</GetOrdersIds> 

Voici le code php qui extrait les balises du xml:

<?php  

$text_all = "<?xml version=\"1.0\"?>\r\n<GetOrdersIds version=\"1.0\">\r\n<Credentials>\r\n<Username>my_username</Username>\r\n<Password>my_password</Password>\r\n</Credentials>\r\n<Criterions>\r\n<OrderNumber></OrderNumber>\r\n<StartDate>2009-01-01</StartDate>\r\n<EndDate>2009-07-01</EndDate>\r\n</Criterions>\r\n</GetOrdersIds>"; 

$field = "Criterions"; 

$result = substr($text_all, strpos($text_all, "<".$field.">")+strlen("<".$field.">"), strpos($text_all, "</".$field.">")-strlen("<".$field.">")-strpos($text_all, "<".$field.">")); 


?> 

Le résultat du code php ci-dessus est:

<OrderNumber></OrderNumber> 
<StartDate>2009-01-01</StartDate> 
<EndDate>2009-07-01</EndDate> 

Lorsque le script est exécuté, le code php passe par mes données MySQL, et des extraits toutes les commandes entre la date de début et la date de fin donnée au dessus.


Y at-il une meilleure façon d'améliorer le code php suivant, de sorte qu'il exécute la même fonction:

$result = substr($text_all, strpos($text_all, "<".$field.">")+strlen("<".$field.">"), strpos($text_all, "</".$field.">")-strlen("<".$field.">")-strpos($text_all, "<".$field.">")); 

Ceci est le code qui recherche à travers les données XML et récupère toutes les balises.

MISE À JOUR:

Quelqu'un peut-il indiquer le code de résultat $ en SimpleXML?

+0

Utiliser la classe php SimpleXML (http://ca2.php.net/simplexml) – tomzx

Répondre

3

Certains temporaires vars vous aideront et rendre également plus facile à lire.

$result = substr($text_all, strpos($text_all, "<".$field.">")+strlen("<".$field.">"), strpos($text_all, "</".$field.">")-strlen("<".$field.">")-strpos($text_all, "<".$field.">")); 

Peut être réécrit en.

$tagLen = strlen('<'.$field.'>'); 
$openTag = strpos($text_all, '<'.$field.'>'); 
$closeTag = strpos($text_all, '</'.$field.'>', $openTag); 

$result = substr($text_all, $openTag + $tagLen, $closeTag - $tagLen - $openTag); 

ou utiliser SimpleXML

$doc = simplexml_load_string($text_all); 
echo $doc->Criterions->asXML(); 

Si vous voulez que les valeurs individuelles utiliser.

$doc = simplexml_load_string($text_all); 

echo $doc->Criterions->OrderNumber; 
echo $doc->Criterions->StartDate; 
echo $doc->Criterions->EndDate; 

si vous voulez que l'élément XML puis utilisez asXML():

$doc = simplexml_load_string($text_all); 

echo $doc->Criterions->OrderNumber->asXML(); 
echo $doc->Criterions->StartDate->asXML(); 
echo $doc->Criterions->EndDate->asXML(); 
+0

Votre code n'est pas complet. Ce n'est pas en me donnant les étiquettes complètes. –

+0

Fixé. Désolé pour ça. Va juste montrer le danger d'avoir une expression vraiment longue comme ça. Je n'ai même pas remarqué l'étiquette de fermeture au début. – gradbot

+0

Sur une note de côté si vous utilisez asXML sur un élément vide ou un élément qui contient un enfant vide, vous obtiendrez au lieu de gradbot

1

Utilisez un analyseur XML comme SimpleXML pour extraire ces données:

$doc = simplexml_load_string($_POST['xml']); 
$OrderNumber = $doc->Criterions->OrderNumber; 
$StartDate = $doc->Criterions->StartDate; 
$EndDate = $doc->Criterions->EndDate; 
+0

Pouvez-vous lister le changement de code de $ result en SimpleXML. –

+0

@Gumbo, j'ai essayé le code ci-dessus. Son fonctionnement mais il me donne seulement la valeur des éléments. (2009-01-01) J'ai besoin de l'élément complet avec sa valeur. i.e ( 2009-01-01) –

2

Avec SimpleXML:

<?php 
$xmlSTR = '<?xml version="1.0" encoding="UTF-8"?> 
<GetOrdersIds> 
    <Credentials> 
     <Username>my_username</Username> 
     <Password>my_password</Password> 
    </Credentials> 
    <Criterions> 
     <OrderNumber></OrderNumber> 
     <StartDate>2009-01-01</StartDate> 
     <EndDate>2009-07-01</EndDate> 
    </Criterions> 
</GetOrdersIds>'; 

$xml = new SimpleXMLElement($xmlSTR); 

echo $xml->Credentials->Username; 

//To see the entire structure print_r($xml); as php can access objects as arrays 
+0

Cela me donnerait seulement la valeur de l'élément. J'ai besoin à la fois de l'élément et de sa valeur.Comme ceci ::: 2009-01-01

1

En supposant que votre chaîne XML est stockée dans la variable appelée $text_all (comme vous montrez dans votre exemple), cela vous obtiendra ce que vous voulez l'homme ...:-)

$mysql_stuff = ''; 
$xml = new SimpleXMLElement($text_all); 

foreach($xml->Criterions->children() as $criterion) { 
    $mysql_stuff .= $criterion->asXML()."\n"; 
} 
echo $mysql_stuff; 

$mysql_stuff contient maintenant

<OrderNumber/> 
<StartDate>2009-01-01</StartDate> 
<EndDate>2009-07-01</EndDate> 

J'ai testé cela et il fonctionne. J'espère que cela répond à votre question!

+0

Merci, essayez-le. –

Questions connexes