2016-03-28 3 views
1

Ich habe eine C++ App, die eine bestimmte XML-Konfiguration verwendet. Diese Konfiguration hat rekursive Knoten. Zum Beispiel SubStrategy kann Strategy Knoten haben, der wiederum einen anderen SubStrategy Knoten haben kann.Seg Fehler beim Parsen rekursiven XML-Schema (XSD) mit Xerces-C++

<?xml version="1.0" encoding="UTF-8"?> 
<CONF xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="rfq.xsd"> 
     <SubStrategy name="ss1"> 
       <Strategy> 
         <SubStrategy name="ss2"/> 
       </Strategy> 
     </SubStrategy> 
     <SubStrategy name="ss3"> 
     </SubStrategy> 
</CONF> 

Ich habe Schema bekam für gleiche, aber meine Anwendung abstürzt, während diese geladen werden. Wenn ich Backtrace in gdb ansehe, kann ich sehen, dass es das rekursive Schema nicht mehr validiert. Unten ist Scehma

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <xs:element name="SubStrategy"> 
       <xs:complexType mixed="true"> 
         <xs:sequence> 
           <xs:element ref="Strategy" minOccurs="0"/> 
         </xs:sequence> 
         <xs:attribute name="name" type="xs:string" use="required"> 
         </xs:attribute> 
       </xs:complexType> 
     </xs:element> 
     <xs:element name="Strategy"> 
       <xs:complexType> 
         <xs:sequence> 
           <xs:element ref="SubStrategy"/> 
         </xs:sequence> 
       </xs:complexType> 
     </xs:element> 
     <xs:element name="CONF"> 
       <xs:complexType> 
         <xs:sequence> 
           <xs:element ref="SubStrategy" maxOccurs="unbounded"/> 
         </xs:sequence> 
       </xs:complexType> 
     </xs:element> 
</xs:schema> 

GDB Backtrace

#0 0x00007ffff6619ee6 in _int_malloc() from /usr/lib64/libc.so.6 
#1 0x00007ffff661c11c in malloc() from /usr/lib64/libc.so.6 
#2 0x00007ffff6ed40cd in operator new(unsigned long)() from /usr/lib64/libstdc++.so.6 
#3 0x00007ffff6f327e9 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)() from /usr/lib64/libstdc++.so.6 
#4 0x00007ffff6f3342b in std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long)() from /usr/lib64/libstdc++.so.6 
#5 0x00007ffff6f334d4 in std::string::reserve(unsigned long)() from /usr/lib64/libstdc++.so.6 
#6 0x00007ffff7bcf468 in push_back (__c=<optimized out>, this=<optimized out>) 
    at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:858 
#7 operator+= (__c=<optimized out>, this=<optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:777 
#8 XMLCh_ToString (s=<optimized out>, n="") at /local_dev/cdmi_bmt/../ConfigFile/src/Test.cpp:75 
#9 0x00007ffff7bc1877 in ConfigFileImp::processSchemaElem (this=0x6273e0, curElem=..., 
    rootname_="CONF.**SubStrategy.Strategy.SubStrategy.Strategy.SubStrategy.Strategy.SubStrategy.Strategy.SubStrategy.Strategy.SubStrategy.Strategy.SubStrategy.Strategy.SubStrategy.Strategy.SubStrategy.Strategy**.SubStr"...) at /local_dev/cdmi_bmt/configFile.cpp:1591 

ich eine 3rd-Party-Wrapper für XML-Parser bin mit der XERCES-C++ Version 3.1.1 intern verwendet. Meine Frage ist, ob jemand weiß, wie man Rekursion im Schema mit XERCES-C verwendet ODER wenn das Problem mit XERCES bekannt ist? Konnte keine relevanten Informationen auf apache Seite finden.

Antwort

1

Es ist nichts falsch mit Ihrem XML oder Ihrem XSD. Ihr XML ist tatsächlich für Ihre XSD gültig.

Xerces kann rekursive XML-Schemas problemlos verarbeiten.

Sie oder der "Wrapper", den Sie verwenden, rufen das Parsing wahrscheinlich in einem Parsing-Callback neu auf. Dies ist nicht der Fehler von Xerces (weder der XML- noch der XSD-Fehler). Es ist ein Problem, wie Xerces verwendet wird.

Verwandte Themen