Melanie Rouette <[EMAIL PROTECTED]> wrote:
> 
> I need to create xml DOM trees from scratch save them as xml files
> so that I can reload them & make modifications to the elements'
> values as well as adding new elements or attributes.  Right now I'm
> using the  XML::LibXML::Document & XML::LibXML::Element classes.
> 
>  And I have a bunch of questions...
> 
> 1- I would to give an XPath expression as a parameter to a method 
> and get as a result a pointer to the position in the DOM tree to 
> either add a nee element/attribute or modify an existing one.  How 
> do I do that?

In general, it's quite difficult to do this with XPath, since 
the expression can refer to multiple nodes.

And consider:

  my $xpath = "//foo/@bar";
  $node->selectSingleNode($xpath) = $value;

If there are multiple <foo/> elements, fine, you take the first
one, but if there aren't any, where on earth would you create it?

That said, it could work in simple cases and I've definitely 
seen a library that tries to do XPath-autovivification, but 
can't remember which one (or even if it was Perl).  :/

Pretty sure libxml doesn't try it.

> 2- Is there a way to have "C++ like friend class" in perl?

The concept doesn't apply.

[this could have been a seperate post by the way]

In the most common case, a Perl object is a blessed hash reference.

  package Foo;
  sub new {
    my $class = shift;
    my $self = { name => "Foo", kids => [] };
    bless $self, $class;
  }

And from here on out, *anybody* can go in and access the hash
directly (not to say that they should, but they can), so there's
no need to explicitly grant access to "friendly" classes/methods.

Meaning you can do this anywhere:

  my $foo = Foo->new;
  $foo->{name} = "Bar";

OTOH, the "standard" hack (but it's much, much, much less 
common than the hashref) for hiding instance data goes something
like:

  package Bar;
  my %members = (name=>1, kids=>1);

  sub new {
    my $class = shift;
    my %data = ( name => "Bar", kids => [] );

    my $sub = sub {
      my $m = shift;
      return unless $members{$m};
      $data{$m} = $_[0] if @_;
      $data{$m};
    };

    bless $sub, $class;
  }

  sub name { my $sub = shift; $sub->("name", @_) }
  sub kids { my $sub = shift; $sub->("kids", @_) }

Now the data is hidden from everybody.

Only the closure ($sub) can see %data, so the *only* way to access
it is by calling the closure, the way name() and kids() do.

Which means: in this case there's nothing you can do to make access
easier for a friendly class/method.  Even Bar itself has to get at
the data indirectly...

And as a third scenario (which might be the one you're interested
in after all) there are XS modules where the instance data is off 
in C-land somewhere and only the wrapped C library knows how to 
access it.

There's nothing preventing you from writing the "friend" class in
XS, though, or with unpack() :).  But Perl can't help you.

> 3- Do XML::LibXML::Document & XML::LibXML::Element class methods
> understand Xpath expressions or do I absolutly have to use
> XML::XPath::Element?

LibXML can do it.  find{,nodes,value}

> 4- Is there a class that represent a DOM tree in XML::XPath package 

Yes.

Don't remember the name, but the answer must be in the manpage... :)

IIRC, it uses a custom DOM-like structure which is not fast (a lot
of niggly low-level stuff written in Perl) and not quite compatible
with any of the other DOM-style modules.

> and is there one which would be a parser like the XML::LibXML 
> module ...

It's built on top of expat (XML::Parser).

> Does it provide the same functionalitites XML::LibXML::Document 
> does?

Not nearly.  But it's easy to install and never segfaults, which
was a significant advantage at one point. :)

Anyway libxml is the best, and if you've got XML::LibXML (or GDOME)
available, use it.

-- 
Steve

perldoc -qa.j | perl -lpe '($_)=m("(.*)")'

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to