Solved

XML indentation issue with simpleXML and DOM in PHP

Posted on 2011-03-07
6
1,362 Views
Last Modified: 2012-05-11
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!
0
Comment
Question by:duder78
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 2
6 Comments
 
LVL 27

Expert Comment

by:Lukasz Chmielewski
ID: 35060627
Can you post the Stack's link ?
0
 
LVL 27

Accepted Solution

by:
Lukasz Chmielewski earned 500 total points
ID: 35060780
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
 

Author Comment

by:duder78
ID: 35060795
0
Why You Need a DevOps Toolchain

IT needs to deliver services with more agility and velocity. IT must roll out application features and innovations faster to keep up with customer demands, which is where a DevOps toolchain steps in. View the infographic to see why you need a DevOps toolchain.

 
LVL 27

Expert Comment

by:Lukasz Chmielewski
ID: 35060867
I think the code #35060780  works.
0
 

Author Closing Comment

by:duder78
ID: 35061002
That's perfect man,  just what I needed.  Thank you very much!
0
 
LVL 27

Expert Comment

by:Lukasz Chmielewski
ID: 35061071
Cheers !
0

Featured Post

MS Dynamics Made Instantly Simpler

Make Your Microsoft Dynamics Investment Count  & Drastically Decrease Training Time by Providing Intuitive Step-By-Step WalkThru Tutorials.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Help with mod_substitute 18 80
Ajax success not firing alert 6 45
Testing a list of Emails for validity 4 35
php non-object 7 29
Browsing the questions asked to the Experts of this forum, you will be amazed to see how many times people are headaching about monster regular expressions (regex) to select that specific part of some HTML or XML file they want to extract. The examp…
Password hashing is better than message digests or encryption, and you should be using it instead of message digests or encryption.  Find out why and how in this article, which supplements the original article on PHP Client Registration, Login, Logo…
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

710 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question