我有一个关于QXmlSchema的问题。问题的基础是一个 xml 模式,其中包含三个文件 -> SCHEMA.xsd --> CompleyTypes.xsd 和 SimpleTypes.xsd
SCHEMA.xsd 包括 complexTypes.xsd这个包括 SimpleTypes.xsd。
我正在使用 QT5 并加载我的架构,如以下部分代码所示:
if(m_xml_shema.load(QUrl(QString("file://home/user/me/SCHEMA.xsd"))
{
// The schema is correct!
}
我的问题是 QXmlSchema 的加载函数是否也实现了链接的 .xsd 文件?如果我尝试验证,验证器说找不到在 complexTypes.xsd 中定义的 I 元素!所有文件都在同一个目录中,我还检查了文件名,我的XML编辑器能够找到链接的文件!
错误可能在哪里?我是否必须以不同的方式加载架构?Di 我必须加载所有三个文件?
由于您在评论中提到无法发布 XSD,因此您应该创建仍然存在问题的最简单的情况。 我不能告诉你QT是做什么的,但要在评论中回答你的问题:是的,它应该可以找到包含或导入的XSD,而无需您显式加载它们。 事实上,基于Xerces的解析器可以做到这一点。
让我尝试帮助您处理一个简单的案例,以显示您的问题结构:
SCHEMA.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">
<xs:include schemaLocation="ComplexTypes.xsd"/>
<xs:element name="a" type="aType"/>
</xs:schema>
ComplexTypes.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">
<xs:include schemaLocation="SimpleTypes.xsd"/>
<xs:complexType name="aType">
<xs:sequence>
<xs:element name="b" type="bType"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
SimpleTypes.xsd:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="1.0">
<xs:simpleType name="bType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
答.xml:
<?xml version="1.0" encoding="utf-8"?>
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="SCHEMA.xsd"><b>1</b></a>
基于 Xerces 的解析器将报告上述a.xml
按原样有效,但如果将1
更改为2
则无效;它发现所有需要的 XSD 都很好。 但是请注意,在 XSD 文件名、目录、URL、命名空间等的规范方面经常出现一些简单的错误。 这就是为什么我建议你发布你的实际XSD(或仍然表现出问题的修剪版本)。 我建议您尝试上述文件,看看QT是否可以找到所有这些XSD。 如果可以,那么你就会知道专注于你对xs:include
或xs:import
语句的特定使用。 如果您有任何后续行动,请发表评论。 希望这有帮助。