我有一个 xsd 来验证 xml 文件,但收到错误 从元素“user”开始发现无效内容。需要“{user}”之一。
如果我将命名空间声明更改为 xmlns:synchronizes="synchronizes"
并将 synchronizes:syncQueryMapping
作为根标记,但保持其余部分相同,则已验证,但我不明白为什么它有效,为什么它是必要的以及为什么其他标签不需要它。
我似乎无法理解和解决这个问题,所以任何帮助将不胜感激!
谢谢!
xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<syncQueryMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="synchronisation"
xsi:schemaLocation="synchronisation syncQueryMappingSchema.xsd">
<user>
<tableName></tableName>
<nameColumn></nameColumn>
<passwordColumn></passwordColumn>
</user>
<group>
<tableName></tableName>
<nameColumn></nameColumn>
</group>
<userGroupMapping>
<tableName></tableName>
<userNameColumn></userNameColumn>
<groupNameColumn></groupNameColumn>
</userGroupMapping>
</syncQueryMapping>
xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0" targetNamespace="synchronisation" xmlns="synchronisation">
<!-- JAXB Configuration -->
<xs:annotation>
<xs:appinfo>
<jaxb:schemaBindings>
<jaxb:package name="synchronisation.implementation" />
</jaxb:schemaBindings>
</xs:appinfo>
</xs:annotation>
<xs:complexType name="dbSyncUserType" >
<xs:sequence>
<xs:element type="xs:string" name="tableName" />
<xs:element type="xs:string" name="nameColumn" />
<xs:element type="xs:string" name="passwordColumn" />
<xs:element type="xs:string" name="suspendStartDateColumn" minOccurs="0" />
<xs:element type="xs:string" name="suspendEndDateColumn" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="dbSyncGroupType">
<xs:sequence>
<xs:element type="xs:string" name="tableName" />
<xs:element type="xs:string" name="nameColumn" />
<xs:element type="xs:string" name="typeColumn" minOccurs="0" />
<xs:element type="typeColumnDataTypeType" name="typeColumnDataType" minOccurs="0" />
<xs:element type="xs:string" name="typeValue" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="typeColumnDataTypeType">
<xs:restriction base="xs:string">
<xs:enumeration value="INTEGER" />
<xs:enumeration value="VARCHAR" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="dbSyncUserTableJoinType">
<xs:sequence>
<xs:element type="xs:string" name="userKeyColumn" />
<xs:element type="xs:string" name="mappingsForeignKeyColumn" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="dbSyncGroupTableJoinType">
<xs:sequence>
<xs:element type="xs:string" name="groupKeyColumn" />
<xs:element type="xs:string" name="mappingsForeignKeyColumn" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="dbSyncUserGroupMappingJoinType">
<xs:sequence>
<xs:element type="dbSyncUserTableJoinType" name="userTable" />
<xs:element type="dbSyncGroupTableJoinType" name="groupTable" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="dbSyncUserGroupMappingType">
<xs:sequence>
<xs:element type="xs:string" name="tableName" />
<xs:element type="xs:string" name="userNameColumn" />
<xs:element type="xs:string" name="groupNameColumn" />
<xs:element type="dbSyncUserGroupMappingJoinType" name="join" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<!-- Root element -->
<xs:element name="syncQueryMapping">
<xs:complexType>
<xs:sequence>
<xs:element type="dbSyncUserType" name="user" />
<xs:element type="dbSyncGroupType" name="group" />
<xs:element type="dbSyncUserGroupMappingType" name="userGroupMapping" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
最佳答案
当您将 xmlns="synchronization"
添加到 XML 文档时,您指定所有不带前缀的嵌套元素都属于该命名空间(syncQueryMapping
和 user
)。
<syncQueryMapping
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="synchronisation"
xsi:schemaLocation="synchronisation syncQueryMappingSchema.xsd">
<user>
....
您需要在 XML 架构中的根元素上添加 elementFormDefault="qualified"
,以指示 XML 文档中与此 XML 架构相对应的所有元素都是命名空间限定的。
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0"
targetNamespace="synchronisation"
xmlns="synchronisation"
elementFormDefault="qualfied">
如果没有指定,为了使 XML 文档有效,只有全局元素应该是命名空间限定的。这意味着您无法使用默认 namespace 。
关于Xml Schema 验证,有效内容无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14436308/