JAXB 2.1 - 自定义xs:任何绑定

are*_*rek 7 java xsd jaxb xjc

我想使用JAXB 2.1 XJC从xsd生成java代码.我提供了xsd架构,我无法更改它.我想在从xml架构生成java类时使用xjc:simple模式.

在xsd中有元素:

<xs:any namespace="##other" processContents="lax"/>
Run Code Online (Sandbox Code Playgroud)

正如在此处所述:http://jaxb.java.net/guide/Mapping_of__xs_any___.html我希望这些元素绑定到:

@XmlAnyElement(lax=true)
public Object any;
Run Code Online (Sandbox Code Playgroud)

但是当我使用简单的绑定模式xjc时:简单我有:

@XmlAnyElement
protected Element any;
Run Code Online (Sandbox Code Playgroud)

我试图找到一个解决方法,但到处都说xs:any是在没有配置的情况下处理的.拥有xs的唯一方法:将任何元素作为java.lang.Object放弃xjc:simple或在xsd 中将processContents更改为"strict".这些选项现在对我来说都不可接受,因为我无法更改xml架构,并且我有一些遗留代码依赖于使用xjc生成的java类:简单模式但现在我需要使用xs:any element我想避免使用org.w3c.dom.Element对象.

任何帮助将非常感激.谢谢.

lex*_*ore 6

您可以使用通配符插件JAXB2基础.这允许您自定义lax/skip/strict通配符绑定模式:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:wildcard="http://jaxb2-commons.dev.java.net/basic/wildcard"
    jaxb:version="2.1"
    jaxb:extensionBindingPrefixes="wildcard">

...

    <xs:complexType name="issueJIIB10Type" mixed="true">
        <xs:annotation>
            <xs:appinfo>
                <wildcard:lax/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexContent mixed="true">
            <xs:extension base="xs:anyType"/>
        </xs:complexContent>
    </xs:complexType> 

...

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

您不必为此更改架构,您可以通过绑定文件使用此自定义.

  • 感谢 lexicore,这个插件几乎是我需要的。我说几乎是因为我找不到将所有 xs:any 全局更改为 java.lang.Object 的方法。每种情况都要单独配置,有点烦。仅供可能需要通过绑定文件配置它的任何人的记录(插件文档根本不涵盖这种情况),您必须直接指向复杂类型,例如: &lt;jxb:bindings schemaLocation="schema.xsd " node="/xs:schema/xs:element[@name='elementName']/xs:complexType"&gt;&lt;wildcard:lax/&gt;&lt;/jxb:bindings&gt; (2认同)