циклы с fwrite для XML - PullRequest
       10

циклы с fwrite для XML

0 голосов
/ 26 августа 2011
function xmlParse() {

    $fh = fopen('schools/' . $this->id . '/books/school_books.xml', 'a');


    $xmlstr = "<?xml version='1.0' ?>\n" .
            "<rows></rows>";

    // create the SimpleXMLElement object with an empty <book> element
    $xml = new SimpleXMLElement($xmlstr);


    $x = 0;

    // add some more child nodes
    for ($i = 0; $i < sizeof($this->students); $i++) {

        $this->students[$i]->getmyBooks();


        for ($j = 0; $j < sizeof($this->students[$i]->myBooks); $j++) {



            $row = $xml->addChild("row");
            $row->addAttribute("id", $x);
            $row->addChild("cell", $this->students[$i]->myBooks[$j]->owner);
            $row->addChild("cell", $this->students[$i]->myBooks[$j]->title);
            $row->addChild("cell", $this->students[$i]->myBooks[$j]->category);
            $row->addChild("cell", $this->students[$i]->myBooks[$j]->price);
            $row->addChild("cell", $this->students[$i]->myBooks[$j]->description);
            $row->addChild("cell", "Test");
            $x++;

            fwrite($fh, $xml->asXML());

        }



    }


}

Я знаю, в чем проблема: его fwrite ($ fh, $ xml-> asXML ());

, если я продолжаю вызывать его в цикле, он не добавляется, он продолжает запускатьсяXML-документ с нуля и повторная публикация тегов.

Моя проблема заключается в том, что он снова и снова записывает теги XML ... вместо того, чтобы просто продолжать работу с XML.Если я делаю это только для одного студента, он работает отлично, но вместо этого, когда я пытаюсь перебрать всех своих учеников, он продолжает печатать теги xml вместо того, чтобы переходить к следующему ученику.

<?xml version="1.0"?>
   <rows>
     <row id="0">
       <cell>Owner</cell>
       <cell>test</cell>
       <cell>Math</cell>
       <cell>11</cell>           
       <cell>test</cell>
       <cell>Test</cell>
     </row>
   </rows>

   <?xml version="1.0"?>

продолжается сзатем следующий снова и снова выполняет xml-теги.

Вот так выглядит один студент:

<rows>
     <row id="0">
       <cell>Owner</cell>
       <cell>Calculus III</cell>
       <cell>Math</cell>
       <cell>82</cell>
       <cell>This book is in great condition! Available asap.</cell>
       <cell>Test</cell>
     </row>
     <row id="1">
       <cell>Owner</cell>
       <cell>Discrete Mathematics</cell>
       <cell>Math</cell>
       <cell>62</cell>
       <cell>This book is in poor condition.</cell>
       <cell>Test</cell>
     </row>
     <row id="2">
       <cell>Owner</cell>
       <cell>Calculus I</cell>
       <cell>Math</cell>
       <cell>12</cell>
       <cell>Really good book.</cell>
       <cell>Test</cell>
     </row>
    </rows>

1 Ответ

1 голос
/ 26 августа 2011

Вы действительно ищете file_put_contents($name, $contents). Эта функция добавляет весь контент в массовом порядке, так что вы бы вызывали его один раз в конце цикла.

Код может выглядеть следующим образом:

// after i >= sizeof($this->students)
file_put_contents('schools/' . $this->id . '/books/school_books.xml', 
                  $xml->asXML());

fwrite, с другой стороны, добавляет файл каждый раз, когда он вызывается. Это означает, что он добавит содержимое XML в файл sizeof($this->students) раз, что вы сейчас видите.

Кстати, в зависимости от размера sizeof($this->students), вы можете объявить локальную переменную для кеширования, которая перед просмотром sizeof будет вызываться каждый раз.

$studentSize = sizeof($this->students);
for ($i = 0; $i < $studentSize; $i++) {

С другой стороны, вы можете изменить это на цикл foreach (не могу описать, как в данный момент, но я добавлю это позже, если я вспомню).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...