有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java XML模式:在complexType中使用属性定义

我在使用SAX解析器进行XML验证时遇到了一些问题。下面是我为解决此问题而制作的一个简单XML模式:

<?xml version="1.0"?>
<xs:schema targetNamespace="urn:test"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    xmlns="urn:test">

    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="content" type="ContentType"
                    maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="ContentType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute ref="title" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:attribute name="title" type="xs:string" />

</xs:schema>

下面是一个非常简单的XML文件,我认为它对于我的模式应该是有效的:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root xmlns="urn:test">
        <content title="Title">
            Content comes here...
        </content>
</root>

有趣的是,当我尝试解析此XML文件时,我收到以下验证错误:

cvc-complex-type.3.2.2: Attribute 'title' is not allowed to appear in element 'content'.

但是如果我从XML文件中删除content元素的title属性,我仍然会收到验证错误:

cvc-complex-type.4: Attribute 'title' must appear on element 'content'.

我不知道是什么问题。当然,这只是一个简单的例子。我想了解这种行为的原因。另外,找到一个解决方案也很好。我不确定在这种情况下,我的Java代码进行验证是否重要,如果有必要,我将稍后发布

任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    title属性的全局声明将该属性放入目标命名空间urn:test。这也意味着您必须在模式和实例文档中限定对属性的引用。默认情况下,非限定属性没有名称空间

    <xs:schema targetNamespace="urn:test"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    xmlns="urn:test" xmlns:test="urn:test" >
    ....    
    <xs:complexType name="ContentType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute ref="test:title" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    
    <xs:attribute name="title" type="xs:string" />
    

    <root xmlns="urn:test" xmlns:test="urn:test" >
        <content test:title="Title">
            Content comes here...
        </content>
    </root>
    

    整个过程非常微妙,当我尝试在ecplise中验证原始实例文档时,会出现两个非常令人困惑的错误:

    1. title属性不能出现在内容元素上。这是指该属性的非限定使用,以及
    2. title元素必须出现在content元素上。这是指缺少的限定test:title属性

    当然,错误消息可以使用更多的上下文信息