【发布时间】:2019-02-14 15:36:59
【问题描述】:
我有一个相当复杂的设置。
我有一个超级项目(全是 Maven)和两个子项目。这两个子项目不相关。我正在设计所有项目中的类并使用 JAXB 注释对它们进行注释,以便在每个子项目级别上创建 XSD。每个子项目都应该包含来自超级项目的 XML 类。超级项目级别不需要 XSD。
在超级项目中,我有几个包,它们都有一个 package-info.java 文件,如下所示:
@javax.xml.bind.annotation.XmlSchema(elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = {
@javax.xml.bind.annotation.XmlNs(prefix = "projectA", namespaceURI = "https://some.url.to/projectA"),
@javax.xml.bind.annotation.XmlNs(prefix = "projectB", namespaceURI = "https://some.url.to/projectB")
})
为简单起见,我们将子项目称为 projectA 和 projectB。
如前所述,在子项目中,我还有几个带有 package-info.java 文件的包,如下所示:
@javax.xml.bind.annotation.XmlSchema(namespace = "https://some.url.to/projectA", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
在项目(A|B)中,我正在从此设置生成 XSD 架构。这工作正常,从子项目到超级项目的所有引用都已找到并解决。
JAXB 为每个子项目生成两个 XSD 文件。在以下示例中,让我们坚持使用项目 A。然后,schema1.xsd 必须遵循以下标题:
<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="https://some.url.to/projectA" xmlns:tns="https://some.url.to/projectA" xmlns:xs="http://www.w3.org/2001/XMLSchema">
紧随其后
<xs:import schemaLocation="schema2.xsd"/>
schema2.xsd 有这个头文件:
<xs:schema elementFormDefault="qualified" version="1.0" xmlns:projectB="https://some.url.to/projectB" xmlns:projectA="https://some.url.to/projectA" xmlns:xs="http://www.w3.org/2001/XMLSchema">
请注意,由于某种原因 projectB 包含在此处,即使 XSD 中没有引用它。在 B 项目中情况正好相反。
在 schema1.xsd 我发现如下行:
<xs:element name="a_name" type="a_type_in_schema2"/>
<xs:element name="another_name" type="tns:a_type_in_schema1" use="required"/>
在 schema2.xsd 中,我发现如下行:
<xs:element name="something" type="another_type_in_schema2" form="unqualified"/>
注意“不合格”属性。它也出现在 schema2.xsd 中定义的复杂类型的每个元素中。
这意味着,来自超级项目的所有内容都包含在 schema2.xsd 中,而仅在项目 A 中定义的所有内容都包含在 schema1.xsd 中。
言归正传,我想做的是编写针对这种 XSD 设置进行验证的 XML,但是我没有这样做。
XML 的标头是:
<rootNode xmlns="https://some.url.to/projectA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://some.url.to/projectA https://some.url.to/projectA.xsd">
每当我尝试引用在 schema2.xsd(= 来自超级项目的类型)中定义的类型时,在此 XML 中,例如
<a_type_in_schema1>
<a_type_in_schema2 .... />
</a_type_in_schema1>
xmllint(还有 Eclipse)会抱怨:
元素 a_type_in_schema2:模式有效性错误:元素 '{https://some.url.to/projectA}a_type_in_schema2': 这个元素不是 预期的。预期是 (a, b, c, a_type_in_schema2, d, e) 之一。
我怎么可能写正确?
请注意,我不希望使用像<namespace:a_type_in_schema2> 这样的合格标签。由于可用性,我希望只使用“普通”的 XML 标记。这个可以吗?
【问题讨论】: