JAXB 2.1 - 自定义 xs:any 绑定

发布于 2025-01-06 04:27:49 字数 873 浏览 1 评论 0 原文

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

在 xsd 中有一些元素:

<xs:any namespace="##other" processContents="lax"/>

正如这里所述: http://jaxb.java.net/guide/Mapping_of__xs_any___.html 我预计这些元素将被绑定到:

@XmlAnyElement(lax=true)
public Object any;

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

@XmlAnyElement
protected Element any;

我试图找到一种解决方法,但到处都是据说 xs:any 无需配置即可处理。将 xs:any 元素设置为 java.lang.Object 的唯一方法是在 xsd 中删除 xjc:simple 或将 processContents 更改为“strict”。这些选项现在对我来说都不可接受,因为我无法更改 xml 架构,并且我有一些遗留代码依赖于使用 xjc:simple 模式生成的 java 类,但现在我需要使用 xs:any 元素,我想避免使用 org.w3c.dom.Element 对象。

任何帮助将不胜感激。谢谢。

I want to generate java code from xsd using JAXB 2.1 XJC. I have an xsd schema provided and I can't change it. I would like to use xjc:simple mode while generating java classes from xml schema.

In the xsd there are elements:

<xs:any namespace="##other" processContents="lax"/>

As it is stated here: http://jaxb.java.net/guide/Mapping_of__xs_any___.html I expected that these elements will be binded to:

@XmlAnyElement(lax=true)
public Object any;

but when I use simple binding mode xjc:simple I have:

@XmlAnyElement
protected Element any;

I was trying to find a workaround, but everywhere it's said that xs:any is handled with no configuration. The only way to have xs:any element as java.lang.Object is to drop xjc:simple or change processContents to "strict" in xsd. None of these options are acceptable right now for me as I can't change xml schema and I have some legacy code that depends on java classes generated with xjc:simple mode but now I need to use xs:any element and I would like to avoid using org.w3c.dom.Element objects.

Any help would be very appreciated. Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

动听の歌 2025-01-13 04:27:49

您可以使用 通配符插件 .highsource.org/display/J2B/JAXB2+Basics+Plugins" rel="noreferrer">JAXB2 基础知识。这允许您自定义宽松/跳过/严格通配符绑定模式:

<?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>

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

You can use the Wildcard plugin from JAXB2 Basics. This allows you to customize lax/skip/strict wildcard binding modes:

<?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>

You don't have to change the schema for this, you can use this customization via binding files.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文