Вставка данных в XML-файл с помощью PHP DOM - PullRequest
6 голосов
/ 12 октября 2008

Я пытался вставить новые данные в существующий файл XML, но он не работает. Вот мой XML-файл:

<list>
    <activity>swimming</activity>
    <activity>running</activity>
<list>

Теперь моя идея заключалась в создании двух файлов: индексной страницы, где она отображает содержимое файла и предоставляет поле для вставки новых элементов, и страницы php, которая будет вставлять данные в файл XML. Вот код для index.php:

<html>
<head><title>test</title></head>
</head>

<?php
    $xmldoc = new DOMDocument();
    $xmldoc->load('sample.xml', LIBXML_NOBLANKS);

    $activities = = $xmldoc->firstChild->firstChild;
    if($activities!=null){
        while(activities!=null){
            echo $activities->textContent.'<br/>';
            activities = activities->nextSibling.
        }
    }
?>

<form name='input' action='insert.php' method='post'>
    insert activity:
    <input type='text' name='activity'/>
    <input type='submit' value='send'/>
</form>
</body>
</html

и вот код для insert.php:

<?php
    header('Location:index.php');
    $xmldoc = new DOMDocument();
    $xmldoc->load('sample.xml');

    $newAct = $_POST['activity'];

    $root = $xmldoc->firstChild;

    $newElement = $xmldoc->createElement('activity');
    $root->appendChild($newElement);
    $newText = $xmldoc->createTextNode($newAct);
    $newElement->appendChild($newText);

    $xmldoc->save('sample.xml');
?>

Пользователь должен получить доступ к index.php, где он увидит список текущих действий, присутствующих в файле XML, и текстовое поле ниже, где он может вставить новые действия. После нажатия кнопки отправки на странице будет вызван insert.php, который содержит код, открывающий файл XML в дереве DOM, вставляет новый узел под корневым узлом и вызывает страницу index.php, где пользователь должен в состоянии увидеть список видов деятельности, его новые действия там под другими. Это не работает. Когда я нажимаю на кнопку, чтобы отправить новую запись, страницы обновляются и, очевидно, ничего не происходит, XML такой же, как и раньше. Что я сделал не так? Кроме того, я хотел бы знать, есть ли лучший способ сделать это.

Ответы [ 6 ]

8 голосов
/ 12 октября 2008

Ваш блок кода копируется и вставляется из существующих файлов? если это так, я вижу две потенциальные проблемы:

<form name='input' action'insert.php' method='post'> // should be:
<form name="input" action="insert.php" method="post">

примечание: вы пропускаете action = "insert.php", что приводит к тому, что форма просто перезагружается без отправки, что вы и описываете.

во-вторых, убедитесь, что у вас есть разрешение на запись в "sample.xml". Вы можете подтвердить, действительно ли вы пишете что-либо:

print 'I wrote '.$xmldoc->save('sample.xml').' bytes of data';
3 голосов
/ 27 декабря 2009

Окончательное решение

sample.xml

<list>
    <activity>swimming</activity>
    <activity>running</activity>
    <activity>Jogging</activity>
    <activity>Theatre</activity>
    <activity>Programming</activity>
</list>

index.php

<html>
<head><title>test</title></head>
</head>

<?php
    $xmldoc = new DOMDocument();
    $xmldoc->load("sample.xml", LIBXML_NOBLANKS);

    $activities = $xmldoc->firstChild->firstChild;
    if($activities!=null){
        while($activities!=null){
            echo $activities->textContent."<br/>";
            $activities = $activities->nextSibling;
        }
    }
?>

<form name="input" action="insert.php" method="post">
    insert activity:
    <input type="text" name="activity"/>
    <input type="submit" value="send"/>
</form>
</body>
</html>

insert.php

<?php
    header('Location:index.php');
    $xmldoc = new DOMDocument();
    $xmldoc->load('sample.xml');

    $newAct = $_POST['activity'];

    $root = $xmldoc->firstChild;

    $newElement = $xmldoc->createElement('activity');
    $root->appendChild($newElement);
    $newText = $xmldoc->createTextNode($newAct);
    $newElement->appendChild($newText);

    $xmldoc->save('sample.xml');
?>
2 голосов
/ 02 ноября 2008

На самом деле вы сделали ошибки в двух местах.

Эта строка должна быть Я думаю, из-за опечатки, вы пропустили знак равенства. Также

Эти строки должны быть

Попробуйте сейчас, это должно работать, Хоп это имело бы какой-то смысл

2 голосов
/ 29 октября 2008

$ newText = $ xmldoc-> createTextNode ($ newActv);

Измените эту строку на

$ newText = $ xmldoc-> createTextNode ($ newAct);

1 голос
/ 18 октября 2009

это код, который я работаю для меня.

index.php

<html>
<head><title>test</title></head>
</head>

<?php
    $xmldoc = new DOMDocument();
    $xmldoc->load('sample.xml', LIBXML_NOBLANKS);

    $activities = $xmldoc->firstChild->firstChild;
    if($activities!=null){
        while($activities!=null){
            echo $activities->textContent.'<br/>';
            $activities = $activities->nextSibling;
        }
    }
?>

<form name='input' action='insert.php' method='post'>
    insert activity:
    <input type='text' name='activity'/>
    <input type='submit' value='send'/>
</form>
</body>
</html>




insert.php


<?php
    header('Location:index.php');
    $xmldoc = new DOMDocument();
    $xmldoc->load('sample.xml');

    $newAct = $_POST['activity'];

    $root = $xmldoc->firstChild;

    $newElement = $xmldoc->createElement('activity');
    $root->appendChild($newElement);
    $newText = $xmldoc->createTextNode($newAct);
    $newElement->appendChild($newText);

    $xmldoc->save('sample.xml');
?>

sample.xml

<list>
  <activity>swimming</activity> 
  <activity>running</activity> 
</list>
1 голос
/ 24 марта 2009

Мне кажется, я знаю, в чем проблема с вашим кодом. Вы не должны писать так: <?xml-stylesheet type="text/xsl" href="sample.xsl" ?> Правильный код:

<?xml:stylesheet type="text/xsl" href="sample.xsl" ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...