Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Lukáš 14. 08. 2011, 23:49:08

Název: Zápis do XML pomocí PHP
Přispěvatel: Lukáš 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.
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Kit 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");
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Lukáš 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?
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Franta 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/
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Kit 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.
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Kit 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");
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Pavel Stěhule 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).
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Kit 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.
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Pavel Stěhule 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.
Název: Re: Zápis do XML pomocí PHP
Přispěvatel: Kit 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ý.