xerces-p-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ja...@openinformatics.com (Jason E. Stewart)
Subject Re: Create and writean XML file
Date Fri, 31 Oct 2003 04:03:56 GMT
Christian Orsatti <orsatti@istar.fr> 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:





  eval {$serializer->setFeature($XML::Xerces::XMLUni::fgDOMWRTFormatPrettyPrint, 1)}; 
  XML::Xerces::error($@) if $@


  Error in eval: Type error in argument 2 of $name, Expected

if we look why:

  DB<12> p $XML::Xerces::XMLUni::fgDOMWRTFormatPrettyPrint


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)) {
  my $target = XML::Xerces::StdOutFormatTarget->new();
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

> 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,

To unsubscribe, e-mail: xerces-p-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-p-dev-help@xml.apache.org

View raw message