Zápis do XML pomocí PHP

Lukáš

Zápis do XML pomocí PHP
« kdy: 14. 08. 2011, 23:49:08 »
Zdravím všechny. Potřeboval bych poradit, jak na XML pomocí PHP.
Mám: PHP 5.3.6, Apache 2.2.15, Mandriva Linux 64bit
Pomocí následujících příkazů se mi podaří zapsat soubor XML:
Kód: [Vybrat]
  $dom = new DOMDocument("1.0", "utf-8");
  $element = $dom->createElement("root");
  $dom->appendChild($element);
  $dom->save("dokument.xml");

Dále se mi ale nedaří vytvořit vnořené značky ve značce root. Můžu jen přidat další na stejné úrovni jako je značka root.
K zápisu vnořených značek bych chtěl použít tyto příkazy:
Kód: [Vybrat]
  $dom = new DOMDocument();
  $dom->load("dokument.xml");
  $Element = $dom->createElement("clanek", "text");
  $Element->setAttribute("autor", false);
  $AtribAutor = $Element->getAttributeNode("autor");
  $AtribAutor->value = "jméno autora";
  $Element->setAttribute("hodnoceni", false);
  $AtribAutor = $Element->getAttributeNode("hodnoceni");
  $AtribAutor->value = "0";
  *** $Element = $dom->appendChild($Element); ***
  $dom->save("dokument.xml");

Příkaz označený hvězdičkami bych potřeboval upravit tak, aby se nově vytvořená značka zapsala mezi párové značky <root></root>. Když se pokusím načíst XML dokument, který nemá žádnou kořenovou značku, načítání skončí chybou.

Zkoušel jsem pomocí metody DOMDocument::getElementsByTagName získat proměnnou, která by odkazovala na značku root a poté jsem použil metodu DOMNode::appendChild, abych nově vytvořeno značku zapsal mezi párové značky root, ale tento postup nefungoval:
Kód: [Vybrat]
$root = $dom->getElementsByTagName("root");
$root->appendChild($Element); // proměnná Element obsahuje značku vytvořenou v kódu výše

Může mi někdo pomoci? Co dělám špatně? Jde zapisovat vnořené značky i jiným způsobem?
Díky za rady.


Kit

Re: Zápis do XML pomocí PHP
« Odpověď #1 kdy: 15. 08. 2011, 00:58:14 »
Kód: [Vybrat]
$dom = new DOMDocument("1.0", "utf-8");
$element = $dom->createElement("root");
$clanek = $dom->createElement("clanek", "text");
$clanek->setAttribute("autor", false);
$element->appendChild($clanek);
$dom->appendChild($element);
$dom->save("dokument.xml");

Lukáš

Re: Zápis do XML pomocí PHP
« Odpověď #2 kdy: 15. 08. 2011, 15:28:54 »
Díky, funguje, ovšem až na jednu dost podstatnou věc (a to stejně jako v mém kódu).
Zapisování totiž funguje pouze jednorázově. Takže když budu chtít XML dokument upravit (to jsem předtím v kódu předpokládal a udělal k tomu funkce), budu muset napsat takový PHP kód, který přečte celé XML, v paměti ho upraví a poté celý XML dokument opět zapíše.
Lze napsat takové PHP, které by upravilo pouze změny v XML dokumentu?

Franta

Re: Zápis do XML pomocí PHP
« Odpověď #3 kdy: 15. 08. 2011, 16:52:15 »
Ono to vždycky bude načíst→upravit→uložit, ale pro tu úpravu můžeš použít i XSLT transformaci (kterou z PHP zavoláš). Ale nevím, jaké přesně úpravy chceš dělat, tak těžko říct, co je nejvhodnější způsob…

Inspirovat se můžeš tady: https://trac.frantovo.cz/xml-web-generator/

Kit

Re: Zápis do XML pomocí PHP
« Odpověď #4 kdy: 15. 08. 2011, 17:49:18 »
Takže když budu chtít XML dokument upravit (to jsem předtím v kódu předpokládal a udělal k tomu funkce), budu muset napsat takový PHP kód, který přečte celé XML, v paměti ho upraví a poté celý XML dokument opět zapíše.
Ale tak je postaven DOM. Pokud potřebuješ, aby data protékala filtrem a přitom se občas něco změnilo, použij SAX.


Kit

Re: Zápis do XML pomocí PHP
« Odpověď #5 kdy: 15. 08. 2011, 18:01:21 »
Lze napsat takové PHP, které by upravilo pouze změny v XML dokumentu?

Možná hledáš tohle:
Kód: [Vybrat]
$dom = new DOMDocument("1.0", "utf-8");
$dom->load("dokument.xml");
$root=$dom->GetElementsByTagName('root')->item(0);
$clanek = $dom->createElement("clanek", "text druhého článku");
$clanek->setAttribute("autor", "Druhý autor");
$root->appendChild($clanek);
$dom->save("dokument.xml");

Re: Zápis do XML pomocí PHP
« Odpověď #6 kdy: 16. 08. 2011, 07:39:37 »
Díky, funguje, ovšem až na jednu dost podstatnou věc (a to stejně jako v mém kódu).
Zapisování totiž funguje pouze jednorázově. Takže když budu chtít XML dokument upravit (to jsem předtím v kódu předpokládal a udělal k tomu funkce), budu muset napsat takový PHP kód, který přečte celé XML, v paměti ho upraví a poté celý XML dokument opět zapíše.
Lze napsat takové PHP, které by upravilo pouze změny v XML dokumentu?

Nelze a nelze to principiálně - soubor na disku nelze z prostředku roztahovat nebo zkracovat - lze jen zrušit, přejmenovat nebo přidávat nové bloky na konec. Takže, když potřebuješ provést úpravu, která uvnitř souboru něco maže nebo vkládá, tak musíš načíst soubor do paměti, modifikovat jej, a uložit (obyčejně pod jiným jménem, a poté, co došlo k úspěšnému uložení se původní soubor smaže a nový přejmenuje).

Kit

Re: Zápis do XML pomocí PHP
« Odpověď #7 kdy: 16. 08. 2011, 12:02:54 »
Takže, když potřebuješ provést úpravu, která uvnitř souboru něco maže nebo vkládá, tak musíš načíst soubor do paměti, modifikovat jej, a uložit (obyčejně pod jiným jménem, a poté, co došlo k úspěšnému uložení se původní soubor smaže a nový přejmenuje).
Vlastně tenhle stav věci mohl být jednou z pohnutek pro vytvoření databází, ve kterých se tato omezení nějakým způsobem obchází. A to tak, že se data předem nějakým definovaným způsobem rozbijí na takové atomy, ze kterých je možné požadovanou informaci opět poskládat.

Takže pokud by přepisování celého souboru mělo být problémem, bylo by vhodné vybrat nějakou databázi. Například SQLite, která je již součástí PHP5 a není tedy nutné nic dalšího instalovat.

Re: Zápis do XML pomocí PHP
« Odpověď #8 kdy: 16. 08. 2011, 13:59:41 »
Takže, když potřebuješ provést úpravu, která uvnitř souboru něco maže nebo vkládá, tak musíš načíst soubor do paměti, modifikovat jej, a uložit (obyčejně pod jiným jménem, a poté, co došlo k úspěšnému uložení se původní soubor smaže a nový přejmenuje).
Vlastně tenhle stav věci mohl být jednou z pohnutek pro vytvoření databází, ve kterých se tato omezení nějakým způsobem obchází. A to tak, že se data předem nějakým definovaným způsobem rozbijí na takové atomy, ze kterých je možné požadovanou informaci opět poskládat.

Takže pokud by přepisování celého souboru mělo být problémem, bylo by vhodné vybrat nějakou databázi. Například SQLite, která je již součástí PHP5 a není tedy nutné nic dalšího instalovat.
dost možná - relační databáze tento problém řešit nemusí - oni jej vůbec neznají - v relačních databázích nezáleží na kterou pozici zapisujete - nezáleží na pořadí, - navíc nejstarší databáze používaly pevnou šířku věty - takže mohly kdykoliv přepsat již neplatný záznam kdekoliv na disku - a když nebylo místo, tak přidávat nové záznamy na konec souboru.

Kit

Re: Zápis do XML pomocí PHP
« Odpověď #9 kdy: 16. 08. 2011, 15:23:41 »
dost možná - relační databáze tento problém řešit nemusí - oni jej vůbec neznají - v relačních databázích nezáleží na kterou pozici zapisujete - nezáleží na pořadí, - navíc nejstarší databáze používaly pevnou šířku věty - takže mohly kdykoliv přepsat již neplatný záznam kdekoliv na disku - a když nebylo místo, tak přidávat nové záznamy na konec souboru.
Do souboru mohu také zapisovat na pozici, kterou si určím. Jen to není tak pohodlné jako u těch databází a musím vyřešit spoustu problémů, které v databázích za mne vyřešil někdo jiný.