You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-users@xerces.apache.org by Michael Weitzel <mi...@uni-siegen.de> on 2008/05/08 22:44:48 UTC
How to detect Xerces-C version / serializing-bug in Xerces 3.0 +
XInclude?
Hi,
first a question: how do I detect which version of Xerces C is
installed? My current interface to Xerces 2.7.0 uses DOMBuilder, which
is deprecated in 3.0. I already switched to DOMLSParser and it works
fine -- but the resulting source code is incompatible with 2.7.0. Is
there a clean way to detect the version? (other than looking for the
DOMLSParser/DOMBuilder classes).
I noticed some strange behaviour in Xerces 3.0 when using XInclude:
I've written a small test app which parses a file containing the
following XInclude spec and serializes the result:
<xi:include href="willi.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude">
<class id="i1">
<member nodes="p18 p29" scc="s7"/>
<member nodes="p22 p31" scc="s11"/>
</class>
</xi:fallback>
</xi:include>
Parsing of the file seems to work fine. In case the file "willi.xml"
exists it is included and the result is properly serialized. However, I
get an infinite loop during serialization (which eats up memory) if
"willi.xml" does NOT exist. In case I remove the fallback element
(including its childs) completely, serialization works as expected and
the unevaluated xi::include-element can be found in the output.
Here is a debugger session:
(gdb) run test.xml
Starting program:
/home/weitzel/uni/FLUX/trunk/xml/support/.libs/lt-xmltest test.xml
[Thread debugging using libthread_db enabled]
[New Thread 1083798464 (LWP 28539)]
Warning: XML parser: Element 'math' was referenced in a content model
but never declared
Warning: XML parser: Unable to include resource
'file:///home/weitzel/uni/FLUX/trunk/xml/support/willi.xml'
^C
Program received signal SIGINT, Interrupt.
[Switching to Thread 1083798464 (LWP 28539)]
0x4023f796 in xercesc_3_0::XMLFormatter::specialFormat (this=0x80cb048,
toFormat=0xbf99d55c, count=1,
escapeFlags=xercesc_3_0::XMLFormatter::NoEscapes)
at xercesc/framework/XMLFormatter.cpp:635
635 , const EscapeFlags escapeFlags)
Here's a backtrace of the endless loop:
#0 0x4023f796 in xercesc_3_0::XMLFormatter::specialFormat (this=0x80cb048,
toFormat=0xbf99d55c, count=1,
escapeFlags=xercesc_3_0::XMLFormatter::NoEscapes)
at xercesc/framework/XMLFormatter.cpp:635
srcPtr = <value optimized out>
endPtr = (const XMLCh *) 0xbf99d55e
#1 0x4023f547 in xercesc_3_0::XMLFormatter::formatBuf (this=0x80cb048,
toFormat=0xbf99d55c, count=1,
escapeFlags=xercesc_3_0::XMLFormatter::DefaultEscape,
unrepFlags=xercesc_3_0::XMLFormatter::DefaultUnRep)
at xercesc/framework/XMLFormatter.cpp:399
theChars = <value optimized out>
actualEsc = xercesc_3_0::XMLFormatter::NoEscapes
actualUnRep = xercesc_3_0::XMLFormatter::UnRep_CharRef
srcPtr = <value optimized out>
endPtr = <value optimized out>
#2 0x4023f8e2 in xercesc_3_0::XMLFormatter::operator<< (this=0x80cb048,
toFormat=32) at xercesc/framework/XMLFormatter.cpp:544
szTmp = {32, 0}
#3 0x4021f259 in xercesc_3_0::DOMLSSerializerImpl::printIndent (
this=0x80d2848, level=4294967295)
at xercesc/dom/impl/DOMLSSerializerImpl.cpp:1626
i = 9237639
#4 0x4022090b in xercesc_3_0::DOMLSSerializerImpl::processNode (
this=0x80d2848, nodeToWrite=0x409c2cb0, level=2)
at xercesc/dom/impl/DOMLSSerializerImpl.cpp:787
filterAction = xercesc_3_0::DOMNodeFilter::FILTER_ACCEPT
nodeLine = <value optimized out>
namespaceMap = <value optimized out>
child = <value optimized out>
nodeName = (const XMLCh *) 0x80a4254
nodeValue = (const XMLCh *) 0x0
lent = 0
#5 0x4022095b in xercesc_3_0::DOMLSSerializerImpl::processNode (
this=0x80d2848, nodeToWrite=0x409c19e0, level=2)
at xercesc/dom/impl/DOMLSSerializerImpl.cpp:988
filterAction = xercesc_3_0::DOMNodeFilter::FILTER_ACCEPT
nodeLine = 2
namespaceMap = (xercesc_3_0::RefHashTableOf<short unsigned int> *) 0x0
child = (DOMNodeSPtr) 0x409c2cb0
nodeName = (const XMLCh *) 0x409c1a24
nodeValue = <value optimized out>
lent = <value optimized out>
#6 0x4022095b in xercesc_3_0::DOMLSSerializerImpl::processNode (
this=0x80d2848, nodeToWrite=0x80a4330, level=1)
at xercesc/dom/impl/DOMLSSerializerImpl.cpp:988
filterAction = xercesc_3_0::DOMNodeFilter::FILTER_ACCEPT
nodeLine = 2
namespaceMap = (xercesc_3_0::RefHashTableOf<short unsigned int> *) 0x0
child = (DOMNodeSPtr) 0x409c19e0
nodeName = (const XMLCh *) 0x80a31dc
nodeValue = <value optimized out>
lent = <value optimized out>
#7 0x40220f56 in xercesc_3_0::DOMLSSerializerImpl::processNode (
this=0x80d2848, nodeToWrite=0x80a2a80, level=0)
at xercesc/dom/impl/DOMLSSerializerImpl.cpp:746
docu = (const xercesc_3_0::DOMDocument *) 0x80a2a74
child = (DOMNodeSPtr) 0x80a4330
nodeName = (const XMLCh *) 0x40373916
nodeValue = (const XMLCh *) 0x80a2a74
lent = <value optimized out>
#8 0x4022241a in xercesc_3_0::DOMLSSerializerImpl::processNode (
this=0x80d2848, nodeToWrite=0x80a2a80)
at xercesc/dom/impl/DOMLSSerializerImpl.cpp:1594
No locals.
#9 0x4022258f in xercesc_3_0::DOMLSSerializerImpl::write (this=0x80d2848,
nodeToWrite=0x80a2a80, destination=0x80ca298)
at xercesc/dom/impl/DOMLSSerializerImpl.cpp:512
janName = {<xercesc_3_0::XMemory> = {<No data fields>},
fData = 0x80cb048}
pTarget = (class xercesc_3_0::XMLFormatTarget *) 0x80d1fc0
janTarget = {<xercesc_3_0::XMemory> = {<No data fields>}, fData = 0x0}
docu = <value optimized out>
lsEncoding = <value optimized out>
#10 0x40024d04 in xml::DOMWriterImplL3::writeToStream (this=0x80a9de0,
out_file=0x406ae3a0) at DOMWriterImplL3.cc:128
theSerializer = (xercesc_3_0::DOMLSSerializer *) 0x80d2848
theOutput = (class xercesc_3_0::DOMLSOutput *) 0x80ca298
gSplitCdataSections = false
gDiscardDefaultContent = true
gFormatPrettyPrint = true
gWriteBOM = false
config = (class xercesc_3_0::DOMConfiguration *) 0x80d284c
myFormatTarget = (class xercesc_3_0::XMLFormatTarget *) 0x80d1fc0
buffer = (const XMLByte *) 0x1 <Address 0x1 out of bounds>
buffer_length = 1073831104
nblocks = 3214530561
e = (class xercesc_3_0::XMLException
&) @0xbf99d848: {<xercesc_3_0::XMemory> = {<No data fields>},
_vptr.XMLException = 0xbf99d8a8, fCode = 134519955,
fSrcFile = 0x80a9de0 "¸º\004\b\001", fSrcLine = 1080746912,
fMsg = 0x80a2a74, fMemoryManager = 0x40024471}
#11 0x08049c93 in main (argc=2, argv=0xbf99d934) at XMLTest.cc:36
doc = (class xercesc_3_0::DOMDocument *) 0x80a2a74
dr = (xml::DOMReader *) 0x8095078
dw = (xml::DOMWriter *) 0x80a9de0
the endless loop is located in
xercesc_3_0::DOMLSSerializerImpl::printIndent (this=0x80d2848,
level=4294967295) at xercesc/dom/impl/DOMLSSerializerImpl.cpp:1625
1625 for(unsigned int i = 0; i < level; i++)
(gdb) print level
$1 = 4294967295
(gdb) print i
$2 = 9237639
Thank you! :-)
--
Cheers,
Michael
Re: How to detect Xerces-C version / serializing-bug in Xerces 3.0 + XInclude?
Posted by Boris Kolpackov <bo...@codesynthesis.com>.
Hi Michael,
Michael Weitzel <mi...@uni-siegen.de> writes:
> first a question: how do I detect which version of Xerces C is
> installed? My current interface to Xerces 2.7.0 uses DOMBuilder, which
> is deprecated in 3.0. I already switched to DOMLSParser and it works
> fine -- but the resulting source code is incompatible with 2.7.0. Is
> there a clean way to detect the version? (other than looking for the
> DOMLSParser/DOMBuilder classes).
I use the _XERCES_VERSION macro:
#if _XERCES_VERSION >= 30000
// 3.0.0 and up
//
#else
// 2.x.y
//
#endif
Boris
--
Boris Kolpackov, Code Synthesis Tools http://codesynthesis.com/~boris/blog
Open source XML data binding for C++: http://codesynthesis.com/products/xsd
Mobile/embedded validating XML parsing: http://codesynthesis.com/products/xsde
Re: How to detect Xerces-C version / serializing-bug in Xerces 3.0
+ XInclude?
Posted by Alberto Massari <am...@datadirect.com>.
Hi Michael,
you can use the #define in XercesVersion.hpp to conditionally compile
Xerces3-specific code; checking XERCES_VERSION_MAJOR should be enough,
otherwise you can use the full _XERCES_VERSION macro.
As for the XInclude bug, can you file a bug report in Jira?
Thanks,
Alberto
Michael Weitzel wrote:
> Hi,
>
> first a question: how do I detect which version of Xerces C is
> installed? My current interface to Xerces 2.7.0 uses DOMBuilder, which
> is deprecated in 3.0. I already switched to DOMLSParser and it works
> fine -- but the resulting source code is incompatible with 2.7.0. Is
> there a clean way to detect the version? (other than looking for the
> DOMLSParser/DOMBuilder classes).
>
> I noticed some strange behaviour in Xerces 3.0 when using XInclude:
> I've written a small test app which parses a file containing the
> following XInclude spec and serializes the result:
>
> <xi:include href="willi.xml" xmlns:xi="http://www.w3.org/2001/XInclude">
> <xi:fallback xmlns:xi="http://www.w3.org/2001/XInclude">
> <class id="i1">
> <member nodes="p18 p29" scc="s7"/>
> <member nodes="p22 p31" scc="s11"/>
> </class>
> </xi:fallback>
> </xi:include>
>
> Parsing of the file seems to work fine. In case the file "willi.xml"
> exists it is included and the result is properly serialized. However, I
> get an infinite loop during serialization (which eats up memory) if
> "willi.xml" does NOT exist. In case I remove the fallback element
> (including its childs) completely, serialization works as expected and
> the unevaluated xi::include-element can be found in the output.
>
> Here is a debugger session:
>
> (gdb) run test.xml
> Starting program:
> /home/weitzel/uni/FLUX/trunk/xml/support/.libs/lt-xmltest test.xml
> [Thread debugging using libthread_db enabled]
> [New Thread 1083798464 (LWP 28539)]
> Warning: XML parser: Element 'math' was referenced in a content model
> but never declared
> Warning: XML parser: Unable to include resource
> 'file:///home/weitzel/uni/FLUX/trunk/xml/support/willi.xml'
> ^C
> Program received signal SIGINT, Interrupt.
> [Switching to Thread 1083798464 (LWP 28539)]
> 0x4023f796 in xercesc_3_0::XMLFormatter::specialFormat (this=0x80cb048,
> toFormat=0xbf99d55c, count=1,
> escapeFlags=xercesc_3_0::XMLFormatter::NoEscapes)
> at xercesc/framework/XMLFormatter.cpp:635
> 635 , const EscapeFlags escapeFlags)
>
> Here's a backtrace of the endless loop:
>
> #0 0x4023f796 in xercesc_3_0::XMLFormatter::specialFormat (this=0x80cb048,
> toFormat=0xbf99d55c, count=1,
> escapeFlags=xercesc_3_0::XMLFormatter::NoEscapes)
> at xercesc/framework/XMLFormatter.cpp:635
> srcPtr = <value optimized out>
> endPtr = (const XMLCh *) 0xbf99d55e
> #1 0x4023f547 in xercesc_3_0::XMLFormatter::formatBuf (this=0x80cb048,
> toFormat=0xbf99d55c, count=1,
> escapeFlags=xercesc_3_0::XMLFormatter::DefaultEscape,
> unrepFlags=xercesc_3_0::XMLFormatter::DefaultUnRep)
> at xercesc/framework/XMLFormatter.cpp:399
> theChars = <value optimized out>
> actualEsc = xercesc_3_0::XMLFormatter::NoEscapes
> actualUnRep = xercesc_3_0::XMLFormatter::UnRep_CharRef
> srcPtr = <value optimized out>
> endPtr = <value optimized out>
> #2 0x4023f8e2 in xercesc_3_0::XMLFormatter::operator<< (this=0x80cb048,
> toFormat=32) at xercesc/framework/XMLFormatter.cpp:544
> szTmp = {32, 0}
> #3 0x4021f259 in xercesc_3_0::DOMLSSerializerImpl::printIndent (
> this=0x80d2848, level=4294967295)
> at xercesc/dom/impl/DOMLSSerializerImpl.cpp:1626
> i = 9237639
> #4 0x4022090b in xercesc_3_0::DOMLSSerializerImpl::processNode (
> this=0x80d2848, nodeToWrite=0x409c2cb0, level=2)
> at xercesc/dom/impl/DOMLSSerializerImpl.cpp:787
> filterAction = xercesc_3_0::DOMNodeFilter::FILTER_ACCEPT
> nodeLine = <value optimized out>
> namespaceMap = <value optimized out>
> child = <value optimized out>
> nodeName = (const XMLCh *) 0x80a4254
> nodeValue = (const XMLCh *) 0x0
> lent = 0
> #5 0x4022095b in xercesc_3_0::DOMLSSerializerImpl::processNode (
> this=0x80d2848, nodeToWrite=0x409c19e0, level=2)
> at xercesc/dom/impl/DOMLSSerializerImpl.cpp:988
> filterAction = xercesc_3_0::DOMNodeFilter::FILTER_ACCEPT
> nodeLine = 2
> namespaceMap = (xercesc_3_0::RefHashTableOf<short unsigned int> *) 0x0
> child = (DOMNodeSPtr) 0x409c2cb0
> nodeName = (const XMLCh *) 0x409c1a24
> nodeValue = <value optimized out>
> lent = <value optimized out>
> #6 0x4022095b in xercesc_3_0::DOMLSSerializerImpl::processNode (
> this=0x80d2848, nodeToWrite=0x80a4330, level=1)
> at xercesc/dom/impl/DOMLSSerializerImpl.cpp:988
> filterAction = xercesc_3_0::DOMNodeFilter::FILTER_ACCEPT
> nodeLine = 2
> namespaceMap = (xercesc_3_0::RefHashTableOf<short unsigned int> *) 0x0
> child = (DOMNodeSPtr) 0x409c19e0
> nodeName = (const XMLCh *) 0x80a31dc
> nodeValue = <value optimized out>
> lent = <value optimized out>
> #7 0x40220f56 in xercesc_3_0::DOMLSSerializerImpl::processNode (
> this=0x80d2848, nodeToWrite=0x80a2a80, level=0)
> at xercesc/dom/impl/DOMLSSerializerImpl.cpp:746
> docu = (const xercesc_3_0::DOMDocument *) 0x80a2a74
> child = (DOMNodeSPtr) 0x80a4330
> nodeName = (const XMLCh *) 0x40373916
> nodeValue = (const XMLCh *) 0x80a2a74
> lent = <value optimized out>
> #8 0x4022241a in xercesc_3_0::DOMLSSerializerImpl::processNode (
> this=0x80d2848, nodeToWrite=0x80a2a80)
> at xercesc/dom/impl/DOMLSSerializerImpl.cpp:1594
> No locals.
> #9 0x4022258f in xercesc_3_0::DOMLSSerializerImpl::write (this=0x80d2848,
> nodeToWrite=0x80a2a80, destination=0x80ca298)
> at xercesc/dom/impl/DOMLSSerializerImpl.cpp:512
> janName = {<xercesc_3_0::XMemory> = {<No data fields>},
> fData = 0x80cb048}
> pTarget = (class xercesc_3_0::XMLFormatTarget *) 0x80d1fc0
> janTarget = {<xercesc_3_0::XMemory> = {<No data fields>}, fData = 0x0}
> docu = <value optimized out>
> lsEncoding = <value optimized out>
> #10 0x40024d04 in xml::DOMWriterImplL3::writeToStream (this=0x80a9de0,
> out_file=0x406ae3a0) at DOMWriterImplL3.cc:128
> theSerializer = (xercesc_3_0::DOMLSSerializer *) 0x80d2848
> theOutput = (class xercesc_3_0::DOMLSOutput *) 0x80ca298
> gSplitCdataSections = false
> gDiscardDefaultContent = true
> gFormatPrettyPrint = true
> gWriteBOM = false
> config = (class xercesc_3_0::DOMConfiguration *) 0x80d284c
> myFormatTarget = (class xercesc_3_0::XMLFormatTarget *) 0x80d1fc0
> buffer = (const XMLByte *) 0x1 <Address 0x1 out of bounds>
> buffer_length = 1073831104
> nblocks = 3214530561
> e = (class xercesc_3_0::XMLException
> &) @0xbf99d848: {<xercesc_3_0::XMemory> = {<No data fields>},
> _vptr.XMLException = 0xbf99d8a8, fCode = 134519955,
> fSrcFile = 0x80a9de0 "¸º\004\b\001", fSrcLine = 1080746912,
> fMsg = 0x80a2a74, fMemoryManager = 0x40024471}
> #11 0x08049c93 in main (argc=2, argv=0xbf99d934) at XMLTest.cc:36
> doc = (class xercesc_3_0::DOMDocument *) 0x80a2a74
> dr = (xml::DOMReader *) 0x8095078
> dw = (xml::DOMWriter *) 0x80a9de0
>
> the endless loop is located in
>
> xercesc_3_0::DOMLSSerializerImpl::printIndent (this=0x80d2848,
> level=4294967295) at xercesc/dom/impl/DOMLSSerializerImpl.cpp:1625
> 1625 for(unsigned int i = 0; i < level; i++)
> (gdb) print level
> $1 = 4294967295
> (gdb) print i
> $2 = 9237639
>
> Thank you! :-)
>