http://www.perlmonks.org?node_id=1052615


in reply to How to fetch a portion of a XML file to save it in another xml file

Note, I closed your suite for you.

use strictures; use XML::LibXML; my $before = <<""; <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Automation Suite" verbose="1" parallel="false"> <test name="Configuration Restore Test Suite"> <classes> <class name="com.qa.testsuite.ConfigurationRestoreTests" /> </classes> </test> <test name="Import Test Suite"> <classes> <class name="com.qa.testsuite.ImportTests" /> </classes> </test> </suite> my $doc = XML::LibXML->new->load_xml( string => $before ); my ( $test_suite ) = $doc->findnodes('/suite/test[@name="Import Test S +uite"]'); $doc->setDocumentElement( $test_suite ); print $doc->serialize; # or $doc->toFile(...)

This may or may not be sane given the DTD but it gives the output you want. Update, there is a toFile() method for the doc.

Replies are listed 'Best First'.
Re^2: How to fetch a portion of a XML file to save it in another xml file
by tarunmudgal4u (Sexton) on Sep 06, 2013 at 12:05 UTC

    Thanks for your input. It's working partially. In case, if I want to add multiple test nodes based on user choice how can I do that. In this example, I can extract only one node based on XPath.

    Also, I want to include suite node in the new.xml file.

      I do think it's time for you to start reading the XML::LibXML docs. See if you can at least get the multiple test nodes captured/found, it's quite a small adjustment. Post what you come up with and if you can't work it all out, I or someone will help you finish.

      Oh, ok! You wore me out and I wrote it yesterday and there's no reason for it to die of bitrot in some corner of my disk. I do hope you will try to pick up a little of it and not just get others to write it for you.

      my $doc = XML::LibXML->new->load_xml( string => $before ); my @tests = $doc->findnodes('/suite/test[@name="Import Test Suite"]'); my $suite = $doc->getDocumentElement; $suite->removeChildNodes; $suite->addChild($_) for @tests; print $doc->serialize(1); # or $doc->toFile("new.xml")

        Superb.. :)

        Let me make a try and i'll get back to you :)