Генериране на XML с нови елементи

Преподавайки себе си на PHP тази седмица и като тестов проект изградих много прост микроблог, който използва XML данни за съхраняване/извличане на информация за кратки публикации. Посочих този въпрос и той успя да доведе ме до точката на създаване на XML документ, който приличаше на това, което исках.

Въпреки това се натъкнах на един проблем, който не можах да разбера сам. В свързаното решение един и същи обект се актуализира отново и отново, без да се поставя нова информация в него:

Например, „третият тестов пост“:

<postslist>
    <post>
        <name>Third Post</name>
        <date>2013-11-05</date>
        <time>00:00</time>
        <text>There is some more post text here.</text>
    </post>
</postslist>

И „четвъртият тестов пост“:

<postslist>
    <post>
        <name>Fourth Post</name>
        <date>2013-11-05</date>
        <time>00:00</time>
        <text>There is even more post text here.</text>
    </post>
</postslist>

Моят PHP досега прилича на това:

        $postname = $_POST["name"];
        $postdate = $_POST["date"];
        $posttime = $_POST["time"];
        $posttext = $_POST["posttext"];

        $postname = htmlentities($postname, ENT_COMPAT, 'UTF-8', false);
        $postdate = htmlentities($postdate, ENT_COMPAT, 'UTF-8', false);
        $posttime = htmlentities($posttime, ENT_COMPAT, 'UTF-8', false);
        $posttext = htmlentities($posttext, ENT_COMPAT, 'UTF-8', false);

        $xml = simplexml_load_file("posts.xml");

        $xml->post = "";
        $xml->post->addChild('name', $postname);
        $xml->post->addChild('date', $postdate);
        $xml->post->addChild('time', $posttime);
        $xml->post->addChild('text', $posttext);

        $doc = new DOMDocument('1.0');
        $doc->formatOutput = true;
        $doc->preserveWhiteSpace = true;
        $doc->loadXML($xml->asXML(), LIBXML_NOBLANKS);
        $doc->save('posts.xml');

Това, което се надявам да направя, е да създам множество "post" елементи и да добавя децата само към най-новия елемент.

Всяка помощ/съвети ще бъдат оценени.


person DesignedMoodily    schedule 01.11.2013    source източник
comment
Трябва да редактирате файла, а не винаги да го създавате отново.   -  person hakre    schedule 02.11.2013


Отговори (2)


Първо, не трябва да смесвате функциите simplexml_ и DOMDocument. Първият е обвивка за втория (и според мен не е особено добър). Ако бях на твое място, просто щях да използвам DOMDocument.

$doc = new DOMDocument('1.0');
$doc->formatOutput = true;
$doc->preserveWhiteSpace = true;

$doc->load('posts.xml', LIBXML_NOBLANKS); // load the posts file with DOMDocument

$newPost = $doc->createElement('post'); // create a new <post> element
$newPost->appendChild($doc->createElement('name', $postname));
$newPost->appendChild($doc->createElement('date', $postdate));
$newPost->appendChild($doc->createElement('time', $posttime));
$newPost->appendChild($doc->createElement('text', $posttext));

$document->documentElement->appendChild($newPost); // add the new <post> to the document

$doc->save('posts.xml');
person lonesomeday    schedule 01.11.2013
comment
Благодаря за съвета и решението. Това проработи като чар! - person DesignedMoodily; 01.11.2013

Първо трябва да отворите файла, за да можете да го редактирате, в противен случай през цялото време замествате целия документ, вместо да го добавяте.

Ето кратък пример за това как работи със SimpleXML, който досега все още е достатъчно прост, за да свърши работата:

$file = 'posts.xml';

$xml  = simplexml_load_file($file); // load existing file
$post = $xml->addChild('post'); // add new post child

// assign values to the post object:
$post->name = $_POST["name"];
$post->date = $_POST["date"];
$post->time = $_POST["time"];
$post->text = $_POST["posttext"];

$xml->saveXML($file); //save file with changes

... и напълно съвместим със своята дъщерна библиотека DOMDocument, в случай че имате нужда от някаква функционалност от там. Те споделят едни и същи обекти на паметта.

person hakre    schedule 02.11.2013