Re: Create and writean XML file
[email protected] (Jason E. Stewart)
| Newsgroups | gmane.text.xml.xerces-p.devel |
|---|---|
| Message-ID | <[email protected]> |
Christian Orsatti <[email protected]> writes: > Sorry to bother you again. No bother - this is the place for questions - and besides things have been far too quiet around here lately. > I am trying to create from sratch an XML file. Base on the Xerces > perl exemple (whichi seems to be old and not really running) and > Xerces C++ ducumentation Yes, some examples are out of date, my appologies. The tests located in the t/ directory should *always* be up-to-date, however. > $serializer->setFeature("$XML::Xerces::fgDOMWRTFormatPrettyPrint", 1); > > This line give me an error: > XML::Xerces::DOMException=HASH(0x8469214) If it can throw an exception, you probably want to wrap it with an eval (like the other calls) and call error() if $@ is set. That will tell you why you can't set pretty print. Also, the symbol is: $XML::Xerces::XMLUni::fgDOMWRTFormatPrettyPrint not: $XML::Xerces::fgDOMWRTFormatPrettyPrint So: eval {$serializer->setFeature($XML::Xerces::XMLUni::fgDOMWRTFormatPrettyPrint, 1)}; XML::Xerces::error($@) if $@ Produces: Error in eval: Type error in argument 2 of $name, Expected perl-string. if we look why: DB<12> p $XML::Xerces::XMLUni::fgDOMWRTFormatPrettyPrint _p_XMLCh=SCALAR(0x1069f9bc) Aha! The unicode constants are being exported as UTF-16 characters and *not* as Perl strings like they should. That _p_FOO garbage is simply SWIG's default wrapping of types it does not understand (SWIG is the tool I use to create the Perl layer on top of the C++ layer). So you won't be able to use the fgFOO constants until I fix that (the same is true for the ISO-8859-1 problem you are having. In the meantime, you simply use Perl strings. Anytime the Xerces-C API tells you to use a UTF-16 string (an XMLCh*, you can simply use a perl string - the XML::Xerces code will automatically convert it for you). Looking at samples/DOMPrint.pl: my $impl = XML::Xerces::DOMImplementationRegistry::getDOMImplementation('LS'); my $writer = $impl->createDOMWriter(); if ($writer->canSetFeature('format-pretty-print',1)) { $writer->setFeature('format-pretty-print',1); } my $target = XML::Xerces::StdOutFormatTarget->new(); $writer->writeNode($target,$doc); we can use the string 'format-pretty-print' instead. > Here I would like to write to a file directly but I haven't found the > equivanlent in Perl of the LocalFileFormatTarget C++ class to use in > writeNode() function. Oops! Looks like I missed this declaration. I've added it now, so it will be in the next release (which I can make in a day or two after I've fixed the string constant problems). In the meantime, using the MemBuf target and simply calling Perl's print function works just as well. > But I can write my string to a file with Perl features. > By my string is all on one line: > > How can I format it with Xerces Perl in order to have an indented XML > (has if is was written through emacs for example) ? setting pretty-print does that fairly well. > Is there better way to do what I want than the code I did ? check samples/DOMPrint.pl or t/DOMWriter.t neither are very advanced, but they are correct and functional. I'm happy to take better examples from anyone who has them. > > $serializer->$serializer->setEncoding("$XML::Xerces::XMLUni::fgISO88591EncodingString"); Yes, this constant is broken as well. It will be fixed in the next release. For now, just using the perl string 'ISO-8859-1' will work. > my $dt = eval{$impl->createDocumentType('PhysicalEntity', 'no', > 'PhysicalEntity.dtd')}; > > ($@) and die ($@); > > my $doc = eval{$impl->createDocument('', 'PhysicalEntity',$dt)}; > ($@) and die ($@); > > $doc->setEncoding("\*XML::Xerces::XMLUni::fgISO88591EncodingString"); You can do either $doc->setEncoding or $serializer->setEncoding whichever you prefer. Thanks again for the feedback, jas.