2012-01-03 2 views
1

Je reçois un flux d'offres et je veux le traiter afin que je puisse l'ajouter à ma base de données. Voici le format, il arrive dans:Comment ajouter des données du flux XML à mysql DB

<deals> 
<item> 
    <couponid>int</couponid> 
    <merchantid>int</merchantid> 
    <merchantname>string</merchantname> 
    <network>string</network> 
    <label>string</label> 
    <restrictions>string</restrictions> 
    <couponcode>string</couponcode> 
    <link>string</link> 
    <directlink>string</directlink> 
    <startdate>YYYY-MM-DD HH:MM TMZ</startdate> 
    <enddate>YYYY-MM-DD HH:MM TMZ</enddate> 
    <image>string</image> 
    <dealtypes> 
    <type>string</type> 
    </dealtypes> 
    <categories> 
    <category>string</category> 
    </categories> 
    <status>status</status> 
    <lastupdated>YYYY-MM-DD HH:MM TMZ</lastupdated> 
    <errorreporturl>string</errorreporturl> 
    <changeaudit>string</changeaudit> 
    <price>string</price> 
    <listprice>string</listprice> 
    <discount>string</discount> 
    <percent>string</percent> 
    <local> 
    <city>string</city> 
    <state>string</state> 
    <zipcode>string</zipcode> 
    <address>string</address> 
    <businessname>string</businessname> 
    <businessurl>string</businessurl> 
    <title2>string</title2> 
    <expirationdate>string</expirationdate> 
    <minpurchase>int</minpurchase> 
    <maxpurchase>int</maxpurchase> 
    <limitedqty>bool</limitedqty> 
    <region>string</region> 
    </local> 
</item> 
</deals> 

je peux traiter la plupart des articles en utilisant:

'couponid' => $node->getElementsByTagName('couponid')->item(0)->nodeValue 

Cependant, comment puis-je traiter les éléments contenus dans le nœud « local ». Tous les éléments du flux n'ont pas ce noeud "local". Comment pourrais-je le traiter? Est-ce que ce travail:

$localData = $node->getElementsByTagName('local')->item(0); 
if $localData { 
'city' => $node->getElementsByTagName('local')->item(city)->nodeValue; 
'state' => $node->getElementsByTagName('local')->item(state)->nodeValue; 
etc.. 
} 
+0

Vous avez dit "Est-ce que ça marcherait", ça marche? Quoi qu'il en soit, '$ node-> getElementsByTagName ('local') -> getElementsByTagName ('city') -> nodeValue' fonctionnerait .. – Dion

Répondre

1

Comme par DOMNodeListdocs, DOMNodeList::item retournera

Le noeud à la position de indexth dans le DOMNodeList ou NULL si n'est pas un index valide.

Donc, non, vous ne pouvez pas faire $node->getElementsByTagName('local')->item(city).

Lorsque vous faites cela $localData = $node->getElementsByTagName('local')->item(0); votre variable $localData est définie sur un objet DOMNode, dont les enfants, vous pouvez alors accéder comme les enfants de tout autre objet DOMNode.

Cependant:

Si vous simplement lire XML et ne pas écrire/appending, SimpleXML de PHP est beaucoup plus simple à utiliser (d'où le nom) que DOM et je le recommande dans votre cas:

$deals = new SimpleXMLElement($my_xml); 

$city = $deals->item->local->city[0]; 
$state = (string) $deals->item->local->state; 

echo "city: $city\n"; 
echo "state: $state\n"; 

On notera que le procédé utilisant le (string) coulée donne le même résultat que le référencement simplement sur la touche [0] de l'élément.

+0

Le script original d'analyse de flux a été fourni par le propriétaire du flux. Je ne sais pas pourquoi ils n'ont pas utilisé SimpleXML. Le nouveau script que j'écris est basé sur le code que vous m'avez donné. Merci beaucoup! – PaperChase

0

En PHP, vous pouvez effectuer les opérations suivantes:

-> Obtenez le fichier xml:

$myXMLString = file_get_contents($url); 
$doc = new DOMDocument('1.0', 'iso-8859-1'); 
$doc->loadXML($myXMLString); 
$deals = $doc->getElementsByTagName("item"); 

foreach($deals as $item){ 
    functionDeals($item); 
} 

Puis, en fonction "functionDeals" extraire l'élément sous la même façon . Sinon, la esiest est d'utiliser Hibernate (Java): suivez ce lien http://javaboutique.internet.com/tutorials/mapping/

Hope this aide

Questions connexes