复杂的扩展xs:anyType是否允许文本内容?

时间:2015-04-05 09:11:29

标签: xml xsd jaxb xjc

我有以下复杂类型:

<xs:complexType name="ValuePropertyType">
    <xs:complexContent>
        <xs:extension base="xs:anyType">
            <xs:attribute name="recordCount" type="xs:positiveInteger"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

是否允许简单的文字内容?像:

<my:values>
2007-04-01T00:00:00.000-06:00,30.4,28.8,155.8,1055.32,55,haze
2007-04-01T00:00:10.000-06:00,30.4,28.8,155.8,1055.4,59,haze
</my:values>

我认为确实如此,但在XML Schema规范中找到规范性引用非常困难。

我也问,因为JAXB XJC在这里生成以下属性:

@XmlAnyElement
protected List<Element> any;

仅期望元素。我认为它也应该允许文本。

更新

Xerces,Eclipse(无论它在下面使用什么),Stylus Studio和Oxygen对this example验证this schema。具体来说,这是问题的complex type

<xs:complexType name="DataValuePropertyType">
    <xs:annotation>
        <xs:documentation>Use to point or include data values inline</xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="xs:anyType">
            <xs:attribute name="recordCount" type="xs:positiveInteger"/>
            <xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

4 个答案:

答案 0 :(得分:3)

complexContent的复杂类型不允许将文本内容作为子项,除非声明为mixed="true"。如果你将它混合在一起,那么它允许任意文本节点混合在内容模型允许的任何元素之间,你可以将文本限制为特定类型(除非你使用simpleContent,但那不会和#39; t根本不允许使用子元素。

答案 1 :(得分:2)

在我做之前,@ potame已经给出了正确答案。但是从那以后

  

在XML Schema规范中找到规范性引用非常......很难

我想在现场为您提供此类参考,而不是指向规范的链接。

因此,如果base的{​​{1}}属性值为xs:extension,则在限制之前允许所有内容作为其内容。规范确实含糊不清,很好的参考是

  

[...] anyType ,它允许任何子项和/或字符数据内容以及任何属性,只要它是格式良好的XML。

Walmsley,Priscilla。确定的XML模式。 Charles F. Goldfarb最终XML系列。 Prentice Hall:2012。P 97。

  

anyType 是允许任何内容的通用复杂类型;任何属性,任何子元素,任何文本内容。

Walmsley,Priscilla。确定的XML模式。 Charles F. Goldfarb最终XML系列。 Prentice Hall:2012。P 203。


然后,关于模式设计的注释:将复杂类型定义为xs:anyType的扩展会导致松散(即不是非常严格)的XML模式文档。实际上,这意味着根据生成的模式有效的文档集远远大于必要的 - 并且模式不会对文档中的结构进行细粒度控制。

这样的XML Schema
xs:anyType

甚至不要求扩展正文中明确定义的属性确实出现在输入文档中,因为它们缺少<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:attributeGroup name="AssociationAttributeGroup"> <xs:attribute name="id" type="xs:ID"/> </xs:attributeGroup> <xs:element name="item" type="DataValuePropertyType"/> <xs:complexType name="DataValuePropertyType"> <xs:annotation> <xs:documentation>Use to point or include data values inline</xs:documentation> </xs:annotation> <xs:complexContent> <xs:extension base="xs:anyType"> <xs:attribute name="recordCount" type="xs:positiveInteger"/> <xs:attributeGroup ref="AssociationAttributeGroup"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema> 属性,其默认值为use

答案 2 :(得分:1)

形式定义可以在XML Schema规范的第1部分中找到,§2.2.1.1XML Schema 1.0XML Schema 1.1和§3.4.7XML Schema 1.0XML Schema 1.1 。根据版本的不同,措辞有点不同,但最后它是相似的。

在版本1.1中更清楚的是anyType是混合内容,因此它同时允许文本内容和标签。

由于您的complexContent是此混合内容的扩展名,因此它也是一种混合内容类型。

然而,基于anyType提供扩展似乎有点奇怪,因为它已经允许任何内容,以及任何属性。在规范中,如果你看§3.4.7,就会提到派生方法限制

答案 3 :(得分:0)

JAXB处理anyType的基本原理可以在JAXB(JSR-22)规范的6.3.3节中找到,并引用如下:

6.3.3xsd:anyType

xsd:anyType is the root of the type definition hierarchy for a schema. All
complex type definitions in a schema implicitly derive from xsd:anyType.
Given that the JAXB 2.0 architecture does not define a common base class for
all JAXB class bindings of complex type definitions, the only possible binding
property base type binding for xsd:anyType is to java.lang.Object.
This binding enables all possible type and element substitutions for an element
of type xsd:anyType.

CODE EXAMPLE 6-1 Binding of element with type xsd:anyType

<xs:element name="anyContent/> <!--@type defaults to xs:anyType-->
    <xs:complexType name="base">
        <xs:sequence>
            <xs:element ref="anyContent/>
            <xs:element name="anyContentAgain" type="xs:anyType"/>
        </xs:sequence>
    </xs:complexType>

public class Base {
    void setAnyContent(Object obj);
    Object getAnyContent();
    void setAnyContentAgain(Object obj);
    Object getAnyContentAgain();
}

A schema author defines an element to be of type xs:anyType to defer
constraining an element to a particular type to the xml document author.
Through the use of xsi:type attribute or element substitution, an xml
document author provides constraints for an element defined as xs:anyType.
The JAXB unmarshaller is able to unmarshal a schema defined xsd:anyType
element that has been constrained within the xml document to an easy to access
JAXB mapped class. However, when the xml document does not constrain the
xs:anyType element, JAXB unmarshals the unconstrained content to an
element node instance of a supported DOM API.

Type substitution is covered in more detail in Section 6.7.4.1 and 6.7.4.2.
Element substitution is covered in more detail in Section 6.7.5.