DOM formatOutput not nice, 1 lined

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
elfduck
Forum Newbie
Posts: 2
Joined: Sat May 23, 2009 8:47 am

DOM formatOutput not nice, 1 lined

Post by elfduck »

Why doesn't PHP's DOM XML output xml-files like they should, with proper hierarchy, instead it outputs everything on one single line. I am trying to create a simple xml guestbook script. Here's my code:

XML:

Code: Select all

 
<?xml version="1.0" encoding="UTF-8"?>
<entries><entry><id>1</id><date>2009-05-26</date><time>20.25.17</time><name>He-Man</name><email>he-man@eterniapostoffice.com</email><message>Lorem ipsum dolor sit amet.</message><ip>127.0.0.1</ip><useragent>Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)</useragent></entry><entry><id>3</id><date>2009-05-26</date><time>20.26.11</time><name>He-Man</name><email>he-man@eterniapostoffice.com</email><message>Lorem ipsum dolor sit amet.</message><ip>127.0.0.1</ip><useragent>Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)</useragent></entry></entries>
 
PHP:

Code: Select all

 
<?php
 
    // User data array
    $data = array (
        'id'        => (int) '0',
        'date'      => (string) date('Y-m-d'),
        'time'      => (string) date('H.i'),
        'name'      => (string) filter_var($_POST['txtname'], FILTER_SANITIZE_STRING),
        'email'     => (string) filter_var($_POST['txtemail'], FILTER_SANITIZE_EMAIL),
        'message'   => (string) filter_var($_POST['txtmessage'], FILTER_SANITIZE_STRING)
    );
 
    // Create a new XML-document
    $xmldoc = new DOMDocument('1.0');
 
    // Nice output format setting
    $xmldoc->formatOutput = true;
 
    // Load XML-document
    $xmldoc->load('entries.xml');
 
    // Count entries and set id to that
    $entries = $xmldoc->getElementsByTagName('entry');
    $data['id'] = (int) $entries->length;
 
    // Select root node
    $root = $xmldoc->firstChild;
 
    // Create new entry
    $newentry = $xmldoc->createElement('entry');
    $newentry = $root->appendChild($newentry);
 
    // ID
    $newnode = $xmldoc->createElement('id');
    $newnode = $newentry->appendChild($newnode);
    $newtext = $xmldoc->createTextNode($data['id']);
    $newtext = $newnode->appendChild($newtext);
 
    // Date
    $newnode = $xmldoc->createElement('date');
    $newnode = $newentry->appendChild($newnode);
    $newtext = $xmldoc->createTextNode($data['date']);
    $newtext = $newnode->appendChild($newtext);
 
    // Time
    $newnode = $xmldoc->createElement('time');
    $newnode = $newentry->appendChild($newnode);
    $newtext = $xmldoc->createTextNode($data['time']);
    $newtext = $newnode->appendChild($newtext);
 
    // Name
    $newnode = $xmldoc->createElement('name');
    $newnode = $newentry->appendChild($newnode);
    $newtext = $xmldoc->createTextNode($data['name']);
    $newtext = $newnode->appendChild($newtext);
 
    // Email
    $newnode = $xmldoc->createElement('email');
    $newnode = $newentry->appendChild($newnode);
    $newtext = $xmldoc->createTextNode($data['email']);
    $newtext = $newnode->appendChild($newtext);
 
    // Save XML-document
    $xmldoc->save('entries.xml');
 
    // Destroy variables
    unset($data);
    unset($xmldoc);
    unset($entries);
    unset($entrycount);
    unset($root);
    unset($newentry);
    unset($newnode);
    unset($newtext);
 
?>
 
Edit: Updated the XML-document because it was misleading.
Last edited by elfduck on Tue May 26, 2009 12:28 pm, edited 3 times in total.
elfduck
Forum Newbie
Posts: 2
Joined: Sat May 23, 2009 8:47 am

Re: DOM formatOutput not nice, 1 lined

Post by elfduck »

I wrote a function to fix that XML-document. I posted this solution to help others that have same kind of problems.

Code: Select all

 
    // Function to clean up "one lined" XML-document outputted by XML DOM
    function fix_xml($filename) {
 
        // Sanitize filename
        $filename = (string) filter_var($filename, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
 
        // Read XML-document into a variable
        $xmldoc = file_get_contents($filename);
 
        // Insert newlines between XML-tags
        $xmldoc = str_replace('><', '>' . "\r\n" . '<', $xmldoc);
 
        // Remove blank lines
        $xmldoc = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\r\n", $xmldoc);
 
        // Save XML-document
        file_put_contents($filename, $xmldoc);
 
    }
 
Edit: Now the function fixes any XML-document.
Last edited by Benjamin on Tue May 26, 2009 10:50 am, edited 1 time in total.
Reason: Changed code type from text to php.
Post Reply