Ошибка сегмента при анализе рекурсивной схемы XML (XSD) с помощью Xerces-C++

У меня есть приложение C++, которое использует конкретную конфигурацию XML. Этот конфиг имеет рекурсивные узлы. Например, SubStrategy могу иметь Strategy узел, который в свою очередь может иметь другой SubStrategy узел.

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

У меня есть схема для того же, но мое приложение падает при загрузке. Если я посмотрю на обратную трассировку в GDB, я увижу, что она умирает, проверяя рекурсивную схему. Ниже это скима

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

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

1 ответ

Решение

В вашем XML или XSD нет ничего плохого. Ваш XML действителен против вашего XSD, на самом деле.

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

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

Другие вопросы по тегам