2016-03-28 12 views
1

Belirli bir XML yapılandırmasını kullanan bir C++ uygulamasına sahibim. Bu yapılandırmada yinelemeli düğümler bulunur. Örneğin, SubStrategy, başka bir SubStrategy düğümüne sahip olabilen Strategy düğümüne sahip olabilir.Seg Hatası Xerces-C++ ile yinelenen XML Şeması (XSD) ayrıştırılırken hata oluştu

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

Aynı şemaya sahibim, ancak bunu yüklerken uygulamanız çöküyor. Gdb'de backtrace'e bakarsam, ölmekte olan yinelemeli şema olduğunu görebiliyorum. Aşağıda 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 

içeriden XERCES-C++ sürüm 3.1.1 kullanılan XML ayrıştırıcı için 3. parti sarmalayıcı kullanıyorum olduğunu. Benim sorgu XERCES-C VEYA XERCES ile bilinen bir konu ise şemada özyinelemeyi nasıl kullanılacağını bilen varsa? apache sayfasında ilgili herhangi bir bilgi bulunamadı.

cevap

1

XML'inizde veya XSD'nizde yanlış bir şey yok. XML'iniz aslında XSD'nize karşı geçerlidir.

Xerces, özyinelemeli XML şemalarını iyi işleyebilir.

Siz ya da kullandığınız "sarıcı" muhtemelen ayrıştırma sırasında geri alma işlemini hatalı bir şekilde yeniden çağırıyor olabilir. Bu Xerces'in hatası değil (XML'ler veya XSD'nin hatası); Xerces'in nasıl kullanıldığıyla ilgili bir problem.