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

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

Does anyone have experience with XML::Parser? I have a little chunk of xml that looks like this:
<part name="foo"> <part name="bar"/> <part name="bar2"/> </part>
and what i want to do is use this to initialize some objects:
my $foo = new Part(name => "foo"); $foo->addPart("bar",new Part(name => "bar")); $foo->addPart("bar2",new Part(name => "bar2")); $foo->startSystem;
I'm having some trouble with the Handlers to make that happen...so much so that I don't even have something that sorta works. I can't seem to get my head around it. Any suggestions?

Replies are listed 'Best First'.
RE: XML::Parser
by Adam (Vicar) on Jun 20, 2000 at 23:38 UTC
    I'm wondering about your example.
    Your code snipit:
    <part name="foo"> <part name="bar"/> <part name="bar2"/> </part>
    is not valid xml. I know its psuedo-code, but it makes the sol'n confusing. Perhaps you meant:
    <section name="foo"> <subsection name="bar"> <subsection name="baz"> </section>
    Or something like that? Then you want
    my $foo = new section( name => "foo" ; $foo->addSubsection( "bar" ); $foo->addSubsection( "baz" ); $foo->startSystem;
    ???
      well...no. the difference is that i don't want to define a name for each level...there may be many levels. so, i might have
      <section name="top"> <section name="chap1"/> <section name="chap2"> <section name="sub1"/> </section> <section name="chap3"/> <section name="chap4"> <section name="sub2"> <section name="table1"/> </section> </section> </section>
      my problem is, in the Handlers definition, how keep a relationship between my "current root section" (ie, the one to which i will be adding the next subsection) and the xml level?

      --
      michael d. ivey, ivey@gweezlebur.com

        You can keep a stack of the current level where you are in the XML file. When you get a start tag, push the tag onto the stack; when you get to the end of that tag, pop the tag off the stack. You can use this to define a tree structure of sorts.

        Another option would be to use the "Tree" Style of XML::Parser. Read the docs for that.

        A final option, and a good one, is to use XML::Simple, which may work for you:

        use XML::Simple; XMLin("foo.xml");
        It loads the data into a tree structure, which may or may not work exactly how you want it.

        Or (finally again) you could look into some of the other tree-processing XML modules, like XML::DOM and XML::Twig. They may be overkill for your purposes, though.

        I didn't know you could do that. I've not done much with XML.