XML indentation issue with simpleXML and DOM in PHP

Hi there,

I've been working on an XML management script in PHP.  You can basically view the contents of an XML file, add items or delete items.  I'm as happy as a clam right now in all honesty.  There is one nagging problem i'm having though...any new items added to the file are displayed as one long line of markup and are not nicely indented like other areas of the file.  I found a fix on StackOverflow...you basically convert the simpleXML object to a DOM object, then set a value and save the file.  It's not working for me though.

Anyways, here's the XML file :
<advertisements>
	<item name="burger">
		<image>burger.jpg</image>
		<price>5.99</price>
		<metric>1 pound</metric>
		<description>Integer tellus nibh, volutpat id sodales vitae, facilisis vel dolor. Etiam accumsan orci quis risus aliquam vitae scelerisque nulla volutpat. Maecenas placerat purus in augue blandit id consequat tellus pellentesque. Pellentesque congue laoreet turpis at lobortis.</description>
	</item>
</advertisements>

Open in new window


..and here is the portion of my code which adds a new <item> element to the file :

$items = array();
		  $items [] = array(
		  'name' => trim($_POST['item_name']),
		  'image' => basename( $_FILES['uploadedfile']['name']),
		  'price' => trim($_POST['price']),
		  'metric' => trim($_POST['metric']),
		  'description' => trim($_POST['description'])
		  );
		  $xml = new SimpleXMLElement('XML/gt.xml', NULL, TRUE);
		  foreach( $items as $item )  {
			$item_xml = $xml->addChild('item');
			$item_xml->addAttribute("name", $item['name']);
			$item_xml->addChild('image', $item['image']);
			$item_xml->addChild('price', $item['price']);
			$item_xml->addChild('metric', $item['metric']);
			$item_xml->addChild('description', $item['description']);
		  }
		  
		  $dom = dom_import_simplexml($xml)->ownerDocument;
		  $dom->formatOutput = true;
		  $dom->save('XML/gt.xml');
		  header("Location: index.php");

Open in new window


The last 3 lines where I created use the $dom variable is the workaround I found on StackOverflow but the indentation is not taking hold for new items.  Any help would be much appreciated!
duder78Asked:
Who is Participating?
 
Lukasz ChmielewskiConnect With a Mentor Commented:
I've managed to get a little closer to what you want:

$items = array();
		  $items [] = array(
		  'name' => trim($_POST['item_name']),
		  'image' => basename( $_FILES['uploadedfile']['name']),
		  'price' => trim($_POST['price']),
		  'metric' => trim($_POST['metric']),
		  'description' => trim($_POST['description'])
		  );
		  $xml = new SimpleXMLElement('XML/gt.xml', NULL, TRUE);
		  foreach( $items as $item )  {
			$item_xml = $xml->addChild('item');
			$item_xml->addAttribute("name", $item['name']);
			$item_xml->addChild('image', $item['image']);
			$item_xml->addChild('price', $item['price']);
			$item_xml->addChild('metric', $item['metric']);
			$item_xml->addChild('description', $item['description']);
		  }
		  
		  $doc = new DOMDocument('1.0');
        $doc->preserveWhiteSpace = false;
        $doc->loadXML($xml->asXML());
        $doc->formatOutput = true;
        $doc->save('XML/gt.xml');

Open in new window

0
 
Lukasz ChmielewskiCommented:
Can you post the Stack's link ?
0
 
duder78Author Commented:
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
Lukasz ChmielewskiCommented:
I think the code #35060780  works.
0
 
duder78Author Commented:
That's perfect man,  just what I needed.  Thank you very much!
0
 
Lukasz ChmielewskiCommented:
Cheers !
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.