Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: Generating elements with attributes and contents using XML::Smart

by gmpassos (Priest)
on Aug 19, 2004 at 13:19 UTC ( [id://384276]=note: print w/replies, xml ) Need Help??


in reply to Generating elements with attributes and contents using XML::Smart

This will create what you want:
use XML::Smart ; my $xml = new XML::Smart() ; $xml->{phone} = '555-1234' ; $xml->{phone}{type} = 'home' ; print $xml->data ;
Output:
<?xml version="1.0" encoding="iso-8859-1" ?> <?meta name="GENERATOR" content="XML::Smart/1.6.8 Perl/5.006001 [MSWin +32]" ?> <phone type="home">555-1234</phone>
See the method apply_dtd() in the XML::Smart documentation to apply automatically a DTD to all your tree.

Graciliano M. P.
"Creativity is the expression of the liberty".

Replies are listed 'Best First'.
Re^2: Generating elements with attributes and contents using XML::Smart
by pfaut (Priest) on Aug 19, 2004 at 14:13 UTC

    That's not working for me. The 'type' attribute gets lost.

    The code:

    use XML::Smart; my $xml = XML::Smart->new; $xml->{customer}{phone} = "555-1234"; $xml->{customer}{phone}{type} = "home"; $xml->apply_dtd(<<EOF); <?xml version="1.0" ?> <!DOCTYPE customer [ <!ELEMENT customer (phone+)> <!ELEMENT phone (#PCDATA)> <!ATTLIST phone type PCDATA #REQUIRED> ]> EOF print $xml->data;

    The results:

    <?xml version="1.0" encoding="iso-8859-1" ?> <?meta name="GENERATOR" content="XML::Smart/1.6.6 Perl/5.008 [MSWin32] +" ?> <!DOCTYPE customer [ <!ELEMENT customer (phone+)> <!ELEMENT phone (#PCDATA)> <!ATTLIST phone type PCDATA #REQUIRED> ]> <customer> <phone>555-1234</phone> </customer> Use of uninitialized value in print at testxml.pl line 19.

    Line 19 is print $xml->data.

    90% of every Perl application is already written.
    dragonchild
      The error is in your DTD syntax! You can't have PCDATA as attribute, since PCDATA is only for contents. You should use CDATA.

      When you apply_dtd(), if some ELEMENT or ATTRIBUTE is not defined in the DTD it will be removed from the tree! So, type is removed since the line ATTLIST is wrong.

      This code will work:

      use XML::Smart; my $xml = XML::Smart->new; $xml->{customer}{phone} = "555-1234"; $xml->{customer}{phone}{type} = "home"; $xml->apply_dtd(<<EOF); <?xml version="1.0" ?> <!DOCTYPE customer [ <!ELEMENT customer (phone+)> <!ELEMENT phone (#PCDATA)> <!ATTLIST phone type CDATA #REQUIRED> ]> EOF print $xml->data;
      Output:
      <?xml version="1.0" encoding="iso-8859-1" ?> <?meta name="GENERATOR" content="XML::Smart/1.6.8 Perl/5.006001 [MSWin +32]" ?> <!DOCTYPE customer [ <!ELEMENT customer (phone+)> <!ELEMENT phone (#PCDATA)> <!ATTLIST phone type CDATA #REQUIRED> ]> <customer> <phone type="home">555-1234</phone> </customer>

      Graciliano M. P.
      "Creativity is the expression of the liberty".

        Yes, that's working perfect. Guess it's time to study the spec some more. Thanks.

        90% of every Perl application is already written.
        dragonchild

        I made these corrections to my full program and DTD and I still have a problem. If I have a 'type' element defined, then the 'type' attribute is still getting converted to a tag inside the 'phone' element.

        use XML::Smart; my $xml = XML::Smart->new; $xml->{customer}{phone} = "555-1234"; $xml->{customer}{phone}{type} = "home"; $xml->apply_dtd(<<EOF); <?xml version="1.0" ?> <!DOCTYPE customer [ <!ELEMENT customer (type?,phone+)> <!ELEMENT phone (#PCDATA)> <!ATTLIST phone type CDATA #REQUIRED> <!ELEMENT type (#PCDATA)> ]> EOF print $xml->data;

        This produces:

        <customer> <phone> <type>home</type>555-1234</phone> </customer>
        90% of every Perl application is already written.
        dragonchild

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://384276]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (6)
As of 2024-04-24 06:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found