【问题标题】:XML Schema: using attribute definition in complexTypeXML Schema:在 complexType 中使用属性定义
【发布时间】:2013-07-28 15:21:43
【问题描述】:

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

<?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:属性“title”不允许出现在元素“content”中。

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

cvc-complex-type.4:属性“title”必须出现在元素“content”上。

我不知道问题是什么。当然,这只是提出问题的一个简单示例。我想了解这种行为的原因。此外,如果能找到解决方案也不错。我不确定我的 Java 代码在这种情况下是否重要,如果有必要我会在稍后发布。

任何帮助将不胜感激。

【问题讨论】:

    标签: java xml xsd sax xml-validation


    【解决方案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 元素必须出现在内容元素上。这是指缺少限定的test:title 属性。

    当然,错误消息可能会使用更多上下文信息。

    【讨论】:

    • 是的,我明白了。谢谢你的回答。我想我会尽可能避免全局属性类型定义。在 XML Schema 中使用完全限定名称来引用这些定义不是问题,但我不想在 XML 数据文件中使用带有命名空间描述符的属性名称。
    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多