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! :-)