我写了一个非常简单的XML:
<?xml version="1.0" encoding="utf-8"?>
<something attribute1="21" attribute2="23">
<newelement code="code1"/>
</something>
我想编写一个 XSD 来验证这个 XML,它运行良好:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="something">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="newelement" nillable="true">
<xs:complexType>
<xs:attribute type="xs:string" name="code"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="attribute1" type="xs:int"/>
<xs:attribute name="attribute2" type="xs:int"/>
</xs:complexType>
</xs:element>
</xs:schema>
但是后来我想编写相同的 XSD,但使用单独的复杂类型,因为例如,如果我需要与newelement
现在相同的结构怎么办。所以我以这种方式重构了我的 XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="my-common-types"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="my-common-types">
<xs:element name="something">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="newelement" nillable="true" type="tns:ElementWithCode"/>
</xs:sequence>
<xs:attribute name="attribute1" type="xs:int"/>
<xs:attribute name="attribute2" type="xs:int"/>
</xs:complexType>
</xs:element>
<xs:complexType name="ElementWithCode">
<xs:attribute name="code" type="xs:string"/>
</xs:complexType>
</xs:schema>
然后,我总是收到此错误:
错误:元素"某物":没有匹配的全局声明可用 为验证根。
因此,在方案中使用targetNamespace
属性存在问题,但我不明白如何使其工作。请给我一些建议。谢谢!
重构的架构适用于命名空间"my-common-types",而原始架构适用于没有命名空间。如果希望元素不在命名空间中,则(全局(元素声明必须位于没有targetNamespace
的架构文档中。如果需要,您仍然可以将类型声明放在命名空间中,但它们必须位于单独的架构文档中,该文档使用xs:import
导入到无命名空间架构文档中。
XML 和 XSD 中都缺少部分。
XML 缺少<something>
元素中的xmlns="my-common-types"
属性。
XSD 缺少<xs:schema>
元素中的elementFormDefault="qualified"
属性。