2016-03-28 5 views
1

У меня есть приложение на C++, которое использует конкретную конфигурацию XML. Эта конфигурация имеет рекурсивные узлы. Например, SubStrategy может иметь узел Strategy, который, в свою очередь, может иметь другой узел SubStrategy.Seg Fault при анализе рекурсивной XML-схемы (XSD) с 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> 

У меня есть схема, но мое приложение рушится во время загрузки. Если я посмотрю на backtrace в gdb, я вижу, что он умирает, проверяя рекурсивную схему. Ниже 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 трассировку

#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 

Я использую 3rd обертку партии для XML-анализатора, внутренне используемой XERCES-C++ версии 3.1.1. Мой запрос: если кто-нибудь знает, как использовать рекурсию в схеме с XERCES-C ИЛИ, если это известная проблема с XERCES? Не удалось найти актуальную информацию на странице apache.

ответ

1

Нет ничего плохого в вашем XML или вашем XSD. Фактически, ваш XML действителен для вашего XSD.

Xerces может обрабатывать рекурсивные XML-схемы просто отлично.

Вы или используемая вами «обертка», вероятно, неправильно обрабатываете парсинг в рамках разворота. Это не ошибка Xerces (а не ошибка XML или XSD); это проблема использования Xerces.