c++ - 使用 Xerces-C++ 解析递归 XML 模式 (XSD) 时出现段错误

标签 c++ xml xsd xml-parsing xerces-c

我有一个使用特定 XML 配置的 C++ 应用程序。此配置具有递归节点。例如,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

我正在为内部使用 XERCES-C++ 的 XML 解析器使用第 3 方包装器版本 3.1.1。我的问题是,是否有人知道如何在 XERCES-C 的模式中使用递归,或者这是否是 XERCES 的已知问题?在 apache 上找不到任何相关信息页面。

最佳答案

您的 XML 或 XSD 没有任何问题。事实上,您的 XML 对您的 XSD 有效。

Xerces 可以很好地处理递归 XML 模式。

您或您正在使用的“包装器”可能在解析回调中不正确地重新调用解析。这不是 Xerces 的错(也不是 XML 或 XSD 的错);这是如何使用 Xerces 的问题。

关于c++ - 使用 Xerces-C++ 解析递归 XML 模式 (XSD) 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261422/

相关文章:

java - JAXB - 如何将 xml 数组映射到对象列表

java - 在Sqlite数据库的同一个Activity布局中添加多个编辑文本(大约60个)

xml - XSD - 如何允许元素以任意顺序任意次数出现?

c++ - 对于具有附加(非推导)模板参数的函数,ADL 失败(或未完成?)

c++ - boost::mutex 发布 VS 调试构建

c++ - 如何使用参数集合格式化 std::string?

java - 要修改的命令行输入和 XML

xml - XML 模式中的处理指令验证

xml - JSON 架构与 XML 架构

c++ - 为什么 strlen (..) 不期望 const char* const str 而不是 const char*