XML bővítése PHP-ből

XML bővítése PHP-ből
2008-12-12T22:29:11+01:00
2009-01-10T11:48:21+01:00
2022-11-12T03:50:33+01:00
danyg
Sziasztok,

van egy XML-em, amit szeretnék bővíteni új adatokkal, PHP segítségével.

Az XML az alábbi:


<?xml version="1.0" encoding="utf-8" standalone="yes"?> <news> <item id="eeba7ae627117d47c51643f713d3ce49"> <title>Lorem Ipsum...</title> <date>2008-02-12</date> <language>en</language> <content>Integer eget risus. Cras at ipsum et odio posuere ullamcorper.</content> </item> <item id="0f288661324da2b1a8ad0e1152008b4d"> <title>Pellus dignissim mollis.</title> <date>2008-10-13</date> <language>en</language> <content>Morbi dictum. Sed condimentum mauris eu nulla. Quisque nisl quam, blandit ac, aliquam eget, pellentesque non, eros.</content> </item> </news>

Már elég sok mindennel próbálkoztam, de valahogy sosem sikerült belelőnöm a jó megoldásba...

// Beolvasom az XML-t $filecnt = file_get_contents('news.xml'); $xml = new DOMDocument(); $xml->loadXML($filecnt); $xml->formatOutput = true; // $content tartalmazza az XML-be írandó adatokat foreach ($content as $key=>$val) { if ($key == "item") { $item = $xml->createElement('item'); $newitem = $xml->documentElement->appendChild($item); $newitem->setAttribute('id',$val); } else { $xpath = new DomXpath($xml); $result = $xpath->query("//item[@id='".$content['id']."']"); $tmp = $xml->createElement($key,$val); $newtmp = $result->appendChild($tmp); // beleirom az új adatokat $handle = fopen('news.xml', "w"); fwrite($handle,$xml->saveXML()); fclose($handle);

illetve próbáltam úgy is, hogy létrehoztam egy új node-ot és azt importNode -dal betettem, de arra invalid Node type error-t kaptam.

$node = new DOMDocument(); foreach ($content as $key=>$val) { if ($key == "item") { $item = $node->createElement('item'); $newitem = $node->appendChild($item); $newitem->setAttribute('id',$val); } else { $xpath = new DomXpath($xml); $result = $xpath->query("//item[@id='".$content['id']."']"); $tmp = $node->createElement($key,$val); $result->appendChild($tmp); } } $newnode = $xml->importNode($node,true);

Akinek van tapasztalata/ötlete, kérem segítsen.
KÖszönöm.
DanyG
Mutasd a teljes hozzászólást!
Ha nem haragszik a Tisztelt Társaság, de végül magamnak sikerült megoldani a problémát,
amint a 2008.12.13. 21:04 időpontban beküldött postban jeleztem.
Viszont rámszólt a prog.hu, hogy ilyen esetben legalább tegyem közzé a megoldást, így következzék
a működő kódrészlet.

// XML betöltése $filecnt = file_get_contents(__XML_PATH__.'/'.$filename); $xml = new DOMDocument(); $xml->loadXML($filecnt); $xml->formatOutput = true; // Megkeresem, hogy az adott id-jú elem létezik-e már $xpath = new DomXpath($xml); $result = $xpath->query("//item[@id='".$content['item']."']"); // Ha nem létezett, akkor létrehozom az item node-ot a megfelelő id-vel // és mentem az xml állományt if ($result->length==0) { $news = $xml->getElementsByTagName($file)->item(0); $item = $xml->createElement('item'); $news->appendChild($item); $item->setAttribute('id',$content['item']); $handle = fopen(__XML_PATH__.'/'.$filename, "w"); $xml->formatOutput = true; fwrite($handle,$xml->saveXML()); fclose($handle); } // végigmegyek a $content tömbön, melynek kulcsai lesznek a node-ok, értékei pedig a tartalmak foreach ($content as $key=>$val) { // AZ item kulcsú elemet kihagyom, azt az előbb használtam if ($key != "item") { // Ha már létezett az elem, akkor replace-elem az adott node tartalmát if ($result->length>=1) { $result->item(0)->replaceChild($xml->createElement($key,$val),$result->item(0)->getElementsByTagName($key)->item(0)); // egyébként lekérem az id alapján az item-et és megcsinálom a beletartozó node-ot. } else { $newpath = new DomXpath($xml); $newres = $newpath->query("//item[@id='".$content['item']."']"); $newres->item(0)->appendChild($xml->createElement($key,str_replace("'","\'",$val))); } } } // XML állomány mentése $handle = fopen(__XML_PATH__.'/'.$filename, "w"); $xml->formatOutput = true; fwrite($handle,$xml->saveXML()); fclose($handle)

Szolgláljék mindeki okosodására :)
És persze mindenkinek köszönöm, aki hozzászólt a témához.
Mutasd a teljes hozzászólást!

  • Árnyék hozzászólása ebben a topicban
    Mutasd a teljes hozzászólást!
  • köszi az ötletet, kismiska, de a feladatleírás alapján DomXML függvényekkel kell megoldanom a problémát, csak kicsit bele vagyok bonyolódva a szülő-gyermek objektumokba.
    Mutasd a teljes hozzászólást!
  • szia,

    valami ilyesmi gondolatébresztőnek?

    $xml = new DOMDocument(); $xml->load('valami.xml'); $news = $xml->getElementsByTagName('news')->item(0); foreach ($content as $key=>$val) { if ($key == "item") { $item = $xml->createElement('item'); $news->appendChild($item); $item->appendChild($xml->createElement('amit_akarsz','valami_ertek')); . . . }

    Mutasd a teljes hozzászólást!
  • Szia,

    ezen az úton haladtam én is, bár a megoldás végül máshogy alakult ki.
    Az <item> kulcs összehozása után mentettem az xml-t és utána a foreach -ben lequery-ztem az id alapján a megfelelő item-et, és az alá illesztettem be a gyermekeket. Abban amit írtál az volt a bajom, hogy a foreach futása közben, amikor nem az $item literálódik, akkor már nem találta meg az $item-et és emiatt nem tudta beilleszteni a mezőket a megfelelő helyre.

    Viszont van további, a témához viszonylag kapcsolódó kérdésem: az elérhető menüket egy user.xml-ből veszem, és odáig meg is vagyok, hogy a menüket kilistázom. Viszont a menü elemeknek vannak attribútumai (milyen mezők érhetőek el az adott oldalon). Ezt egyelőre statikusan olvasgatom be, de az igazán szép a lenne, ha ezt dinamikusan, az attribútum-lista kiolvasásával tudnám megoldani.
    Próbáltam a DomNode->attributes -sel beolvasni, de ezek DomElement Object-ek és a attributes-re DOMNamedNodeMap Object-eket ad vissza.
    Tehát szeretném úgy megoldani, hogyha nem tudom a konkrét attribútum neveket, akkor is tudjam kezelni ezt a menüt.


    <news title="1" date="1" lang="1" content="1" /> <agenda title="1" date="1" content="1" /> print_r($menus->item($i)->attributes); for ($i=0; $i<$menus->length; $i++) { $usermenu[$menus->item($i)->nodeName]['title'] = $menus->item($i)->getAttribute('title'); ... }
    Mutasd a teljes hozzászólást!
  • imho
    $xml->getElementsByTagName('news')->item(0);
    helyett elég
    $xml->news;
    is ha jól emlékszem, amúgy jah, ennyi.
    Mutasd a teljes hozzászólást!
  • csak a kíváncsiság kedvéért kipróbáltam, de ezzel az egyszerűsítéssel semmit nem adott vissza.

    Viszont belefutottam még egy problémába, de azt sztem másik szálra futtatom :P
    Mutasd a teljes hozzászólást!
  • Hmm simpleXML-el ment én úgy emlékszem, de ezek szerint ez a DOMXML más kicsit.
    Mutasd a teljes hozzászólást!
  • Ha nem haragszik a Tisztelt Társaság, de végül magamnak sikerült megoldani a problémát,
    amint a 2008.12.13. 21:04 időpontban beküldött postban jeleztem.
    Viszont rámszólt a prog.hu, hogy ilyen esetben legalább tegyem közzé a megoldást, így következzék
    a működő kódrészlet.

    // XML betöltése $filecnt = file_get_contents(__XML_PATH__.'/'.$filename); $xml = new DOMDocument(); $xml->loadXML($filecnt); $xml->formatOutput = true; // Megkeresem, hogy az adott id-jú elem létezik-e már $xpath = new DomXpath($xml); $result = $xpath->query("//item[@id='".$content['item']."']"); // Ha nem létezett, akkor létrehozom az item node-ot a megfelelő id-vel // és mentem az xml állományt if ($result->length==0) { $news = $xml->getElementsByTagName($file)->item(0); $item = $xml->createElement('item'); $news->appendChild($item); $item->setAttribute('id',$content['item']); $handle = fopen(__XML_PATH__.'/'.$filename, "w"); $xml->formatOutput = true; fwrite($handle,$xml->saveXML()); fclose($handle); } // végigmegyek a $content tömbön, melynek kulcsai lesznek a node-ok, értékei pedig a tartalmak foreach ($content as $key=>$val) { // AZ item kulcsú elemet kihagyom, azt az előbb használtam if ($key != "item") { // Ha már létezett az elem, akkor replace-elem az adott node tartalmát if ($result->length>=1) { $result->item(0)->replaceChild($xml->createElement($key,$val),$result->item(0)->getElementsByTagName($key)->item(0)); // egyébként lekérem az id alapján az item-et és megcsinálom a beletartozó node-ot. } else { $newpath = new DomXpath($xml); $newres = $newpath->query("//item[@id='".$content['item']."']"); $newres->item(0)->appendChild($xml->createElement($key,str_replace("'","\'",$val))); } } } // XML állomány mentése $handle = fopen(__XML_PATH__.'/'.$filename, "w"); $xml->formatOutput = true; fwrite($handle,$xml->saveXML()); fclose($handle)

    Szolgláljék mindeki okosodására :)
    És persze mindenkinek köszönöm, aki hozzászólt a témához.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd