0

我有一个关于 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 编辑器能够找到链接的文件!

错误可能在哪里?我是否必须以不同的方式加载架构?我必须加载所有三个文件吗?

4

1 回答 1

0

由于您在评论中提到您无法发布 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>

复杂类型.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>

简单类型.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:includeorxs:import语句的特定用途。如果您有任何后续行动,请发表评论。希望这可以帮助。

于 2013-10-17T13:11:27.583 回答