Xml Schema 验证,有效内容无效

标签 xml validation xsd

我有一个 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 文档时,您指定所有不带前缀的嵌套元素都属于该命名空间(syncQueryMappinguser )。

<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/

相关文章:

java - 更改 android.R.layout.simple_list_item_2 中的文本颜色

xml - xs :choice unbounded list

java - 使用jaxb将xml解析为java对象时接收错误

java - 尽管出现了 fragment 内容,但工具栏内容并未出现

javascript - Angular - 依赖字段验证

regex - 如何使用 Angular 5 Validator Pattern 验证密码强度

java - MULE 4 IntelliJ 解析 xsd 模式

java - jaxb可以生成这样的xml模式吗?

xml - 如何使用xslt修改xml文件

java - 有什么工具或技术可以以编程方式验证数据库之间的约束吗?