XRZ1138 has asked for the wisdom of the Perl Monks concerning the following question:

Hello,
I am opening an XML doc that looks something like:
===========================
<?xml version="1.0" encoding="UTF-8"?>  <---This will disappear
<project>
  <dependencies>
	<dependency>
      <groupId>foo</groupId>
      <artifactId>bar</artifactId>
      <version>1.0</version>
      <type>jar</type>
    </dependency>
  </dependencies>
</project>
===========================

On this file I run something like this:
===========================
  my $xp = XML::XPath->new(filename => $filename);
  $xp->setNodeText("/project/dependencies/dependencyversion='1.0'/version", 2.0);
  open (OUTF, ">$filename");
  print OUTF XML::XPath::XMLParser::as_string($xp->findnodes('/'));
===========================

I end up with what I want:
===========================
<project>
  <dependencies>
	<dependency>
      <groupId>foo</groupId>
      <artifactId>bar</artifactId>
      <version>2.0</version>       <---- Only change
      <type>jar</type>
    </dependency>
  </dependencies>
</project>
===========================

BUT the xml prolog is gone.

I checked the XML::XPATH docs for a method to grab and store the header,
but did not find it. 

...or is there some other technique that I am missing?

Any pointers appreciated,

Chris

Replies are listed 'Best First'.
Re: XPATH as_string losing prolog
by wind (Priest) on Mar 17, 2011 at 23:41 UTC

    The XML::XPath::XMLParser::as_string treats all nodes the same, even if you're working with the root node. Therefore it does not contain the header information of a full xml document.

    If you want the header, just capture it independently and print it out.

    use XML::XPath; use strict; my $filename = 'test.xml'; my $header = do { open my $fh, $filename or die "$filename: $!"; <$fh>; }; my $xp = XML::XPath->new(filename => $filename); $xp->setNodeText("/project/dependencies/dependency[version='1.0']/vers +ion", 2.0); open my $fh, '>', $filename or die "$filename: $!"; print $fh $header; print $fh XML::XPath::XMLParser::as_string($xp->findnodes('/')); close $fh;
    Also, use <code> instead of <pre> tags per How do I post a question effectively?.
Re: XPATH as_string losing prolog
by Anonymous Monk on Mar 18, 2011 at 02:48 UTC
    XML, XPATH, the DOM, they're very much object oriented, and as_string is a method, and you should call it as such, its less typing