Re: Error when attempting to use cloneNode - Can't locate object method "cloneNode" via package "XML::DOM::NodeList"
by Richard E. Rathmann other posts by this author
Jul 25 2007 3:16PM messages near this date
view in the new Beta List Site
Re: Error when attempting to use cloneNode - Can't locate object method "cloneNode" via package "XML::DOM::NodeList"
|
Re: Error when attempting to use cloneNode - Can't locate object method "cloneNode" via package "XML::DOM::NodeList"
& XSLT As Bjoern was alluding to, using XML::LibXML is much preferred over
using XML::DOM (which hasn't been updated in a couple of years, unlike
XML::LibXML). However, both provide you DOM-based parsing (XML::LibXML
also supports some additional XPath functionality with its findXXX()
methods, which is another bonus over XML::DOM), and for the most part
can be used interchangeably.
To accomplish with XML::LibXML what I believe you're trying to do:
### begin code ####
#!/usr/bin/perl
use XML::LibXML;
# setup parser and parse your respective documents...I'll leave this to you
my @articles = $source_xml-> getElementsByTagName('Article');
for my $article (@articles) {
# importNode() will implicitly deep-clone the node, but is required for
# taking a node from one XML document and placing in another
$target_xml-> importNode($article);
# add the "imported" node as the last child of the "articles" node
(i.e. "document node")
$target_xml-> documentElement()->appendChild($article);
}
# output your final results...again I leave this to you
### end code ###
If you MUST use XML::DOM (e.g., you can't get XML::LibXML installed,
but, judging by the reference in your previous post, I'm assuming that
isn't the case for you), you can achieve the same with similar but
slightly different code:
### begin code ####
#!/usr/bin/perl
use XML::DOM;
# setup parser and parse your respective documents...I'll leave this to you
# getElementsByTagName() returns a node list, so you need to
# loop through the results, even if there is only one
my @articles = $source_xml-> getElementsByTagName('Article');
for my $article (@articles) {
my $clone = $article-> cloneNode(1);
# need to use setOwnerDocument() to transfer the clone to the target doc
$clone-> setOwnerDocument($target_xml);
# add the "imported" clone as the last child of the "articles" node
(i.e. "document node")
$target_xml-> getDocumentElement()->appendChild($clone);
}
# output your final results...again I leave this to you
### end code ###
(BTW, you can actually use cloneNode(1)/setOwnerDocument() in
XML::LibXML as well...importNode() just saves you some typing.)
HTH,
Richard
John Krewson wrote:
> Bjoern,
>
> This is my first time using Perl to work with XML in this way, so my
> reasoning for using XML::DOM is simply based upon some examples I have
> found. Do you think it would be better to use XML::LibXML when making
> a copy of data in one file to paste into another?
>
> My thought was that cloning the node would be easiest way to simple
> grab all the content between <Article></Article> so that this data
> could be pasted into another XML file. Basically, I have a lot of
> 'stand alone' files that contain content, and I need to consolidate
> that content into one main XML file.
>
> Ex:
> a = clone of <Article>nodes between</Article>
> then
> paste in between <Articles></Articles> in another file.
>
> Thanks very much for your response.
>
> On 7/25/07, *Bjoern Hoehrmann* <derhoermi@[...].net
> <mailto:derhoermi@[...].net>> wrote:
>
> * John Krewson wrote:
> >I am getting the following error when attempting to use
> cloneNode, in order
> >to clone a node and then paste this node into a target file:
> >Can't locate object method "cloneNode" via package
> "XML::DOM::NodeList"
>
> If you have XML::LibXML I don't think there is any reason to use
> XML::DOM. As for your problem, getElementsByTagName returns a node
> list (zero or more nodes); you are trying a method for a single
> node on a list of nodes, you have to clone the nodes one by one.
> Not that I am sure why you are trying to clone them in the first
> place.
> --
> Bj�rn H�hrmann � mailto:bjoern@[...].de
> <mailto:bjoern@[...].de> � http://bjoern.hoehrmann.de
> <http://bjoern.hoehrmann.de>
> Weinh. Str. 22 � Telefon: +49(0)621/4309674 �
> http://www.bjoernsworld.de
> 68309 Mannheim � PGP Pub. KeyID: 0xA4357E78 �
> http://www.websitedev.de/ <http://www.websitedev.de/>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Perl-XML mailing list
> Perl-XML@[...].com
> To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
>
Thread:
John Krewson
Bjoern Hoehrmann
John Krewson
Richard E. Rathmann
John Krewson
James Woodworth
John Krewson
|