Тип аннотации XmlAnyElement
@Retention(value=RUNTIME)
@Target(value={FIELD,METHOD})
public @interface XmlAnyElement Сопоставляет свойство JavaBean с представлением XML-информационного набора и/или элементом JAXB.
Эта аннотация служит "универсальным" свойством при разборке xml-контента в экземпляр класса JAXB с аннотациями. Обычно она аннотирует многозначное свойство JavaBean, но может встречаться и на свойстве JavaBean с одним значением. Во время разборки каждый XML-элемент, не соответствующий статической аннотации @XmlElement или @XmlElementRef для других свойств JavaBean в классе, добавляется к этому "универсальному" свойству.
Использование:
@XmlAnyElement public Element[] others; // Collection of Element or JAXB elements. @XmlAnyElement(lax="true") public Object[] others; @XmlAnyElement private List<Element> nodes; @XmlAnyElement private Element node;
Ограничения использования
Эта аннотация несовместима с XmlElement, XmlAttribute, XmlValue, XmlElements, XmlID и XmlIDREF.
В классе и его суперклассах может быть только одно свойство JavaBean, аннотированное XmlAnyElement.
Взаимосвязь с другими аннотациями
Эта аннотация может использоваться с XmlJavaTypeAdapter, чтобы пользователи могли сопоставлять собственные структуры данных с DOM, которые затем могут быть преобразованы в XML.
Эта аннотация может использоваться с XmlMixed следующим образом:
// List of java.lang.String or DOM nodes. @XmlAnyElement @XmlMixed List<Object> others;
Пример схемы к Java
Следующая схема приведет к следующему классу Java:<xs:complexType name="foo">
<xs:sequence>
<xs:element name="a" type="xs:int" />
<xs:element name="b" type="xs:int" />
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType> class Foo {
int a;
int b;
@XmlAnyElement
List<Element> any;
} Она может разбирать такие экземпляры, как <foo xmlns:e="extra"> <a>1 <e:other /> // this will be bound to DOM, because unmarshalling is orderless <b>3 <e:other /> <c>5 // this will be bound to DOM, because the annotation doesn't remember namespaces. </foo>Следующая схема приведет к следующему классу Java:
<xs:complexType name="bar">
<xs:complexContent>
<xs:extension base="foo">
<xs:sequence>
<xs:element name="c" type="xs:int" />
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:extension>
</xs:complexType> class Bar extends Foo {
int c;
// Foo.getAny() also represents wildcard content for type definition bar.
} Она может разбирать такие экземпляры, как <bar xmlns:e="extra"> <a>1 <e:other /> // this will be bound to DOM, because unmarshalling is orderless <b>3 <e:other /> <c>5 // this now goes to Bar.c <e:other /> // this will go to Foo.any </bar>
Использование XmlAnyElement с XmlElementRef
Аннотация XmlAnyElement может использоваться с XmlElementRef для обозначения дополнительных элементов, которые могут участвовать в дереве содержимого.
Следующая схема приведет к следующему классу Java:
<xs:complexType name="foo">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="a" type="xs:int" />
<xs:element name="b" type="xs:int" />
<xs:any namespace="##other" processContents="lax" />
</xs:choice>
</xs:complexType> class Foo {
@XmlAnyElement(lax="true")
@XmlElementRefs({
@XmlElementRef(name="a", type="JAXBElement.class")
@XmlElementRef(name="b", type="JAXBElement.class")
})
List<Object> others;
}
@XmlRegistry
class ObjectFactory {
...
@XmlElementDecl(name = "a", namespace = "", scope = Foo.class)
JAXBElement<Integer> createFooA( Integer i ) { ... }
@XmlElementDecl(name = "b", namespace = "", scope = Foo.class)
JAXBElement<Integer> createFooB( Integer i ) { ... } Она может разбирать такие экземпляры, как <foo xmlns:e="extra"> <a>1 // this will unmarshal to a JAXBElement instance whose value is 1. <e:other /> // this will unmarshal to a DOM Element. <b>3 // this will unmarshal to a JAXBElement instance whose value is 1. </foo>
Эмуляция нестрогого (lax) подстановочного знака W3C XML Schema
Элемент lax аннотации позволяет эмулировать семантику нестрогого подстановочного знака. Например, когда исходный код Java аннотирован так:@XmlRootElement
class Foo {
@XmlAnyElement(lax=true)
public Object[] others;
} , то следующий документ будет разбираться так: <foo> <unknown /> <foo /> </foo> Foo foo = unmarshal(); // 1 for 'unknown', another for 'foo' assert foo.others.length==2; // 'unknown' unmarshals to a DOM element assert foo.others[0] instanceof Element; // because of lax=true, the 'foo' element eagerly // unmarshals to a Foo object. assert foo.others[1] instanceof Foo;
- С:
- JAXB2.0
Дополнительные элементы
| Модификатор и тип | Дополнительный элемент и описание |
|---|---|
boolean |
lax Управляет поведением разборщика при встрече с элементами, известными текущему |
Class<? extends DomHandler> |
value Указывает |
Элементы
lax
public abstract boolean lax
Управляет поведением разборщика при встрече с элементами, известными текущему JAXBContext.
Когда false
Если false, все элементы, соответствующие свойству, будут разбираться в DOM, и свойство будет содержать только элементы DOM.
Когда true
Если true, когда элемент соответствует свойству, помеченному XmlAnyElement, и известен JAXBContext (например, есть класс с XmlRootElement, имеющий то же имя тега, или есть XmlElementDecl с тем же именем тега), разборщик будет немедленно разбирать этот элемент в объект JAXB вместо DOM. Кроме того, если элемент неизвестен, но имеет известный xsi:type, разборщик немедленно разбирает элемент в JAXBElement с именем неизвестного элемента, а значение JAXBElement устанавливается в экземпляр JAXB-отображения известного xsi:type.
В результате после разбора свойство может стать неоднородным; оно может содержать как узлы DOM, так и некоторые объекты JAXB одновременно.
Это можно использовать для эмуляции семантики нестрогого подстановочного знака (lax) W3C XML Schema.
- По умолчанию:
- false
value
public abstract Class<? extends DomHandler> value
Указывает DomHandler, который отвечает за фактическое преобразование XML в/из структуры данных, подобной DOM.
- По умолчанию:
- javax.xml.bind.annotation.W3CDomHandler.class
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.