我写了一个非常简单的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
属性存在问题,但我不知道如何使它起作用。请给我一些建议。谢谢!
答案 0 :(得分:1)
您的重构模式用于名称空间“ my-common-types”,而原始模式则不用于名称空间。如果您希望元素不存在命名空间,则(全局)元素声明必须位于不包含targetNamespace
的架构文档中。如果需要,您仍然可以将类型声明放在命名空间中,但是它们必须放在单独的模式文档中,然后使用xs:import
导入到无命名空间模式文档中。
答案 1 :(得分:0)
XML和XSD都缺少一些部分。
XML缺少xmlns="my-common-types"
元素的<something>
属性。
XSD缺少elementFormDefault="qualified"
元素的<xs:schema>
属性。