当前位置: 首页 > 知识库问答 >
问题:

如何让JAXB模式允许一个@XmlRootElement类的多个元素名称

姚飞昂
2023-03-14

这与JAXB生成的No@XmlRootElement等问题的方向相反。基本上,我想运行schemagen并拥有两个相同类型的全局元素。

<xs:element name="root1" type="tns:sameType"/>
<xs:element name="root2" type="tns:sameType"/>

我了解如何使用JAXBElement列表事物,但我不知道如何正确生成模式。在我看来,它看起来像以下片段(@XmlRootElements是虚构的)。

@XmlRootElements(value = {
    @XmlRootElement(name="root1", namespace="urn:example"),
    @XmlRootElement(name="root2", namespace="urn:example")
})

共有1个答案

阎宾实
2023-03-14

您可以在用注册表注释的类上使用注释。

对象工厂

@XmlElementDecl注释在类型具有与其对应的多个全局元素时使用。注释放置在带有@Xml注册表注释的类上的create方法上。当模型从XML模式生成时,此类始终称为ObjectFactory

package forum14845035;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name="root1")
    public JAXBElement<SameType> createRoot1(SameType sameType) {
        return new JAXBElement<SameType>(new QName("urn:example", "root1"), SameType.class, sameType);
    }

    @XmlElementDecl(name="root2")
    public JAXBElement<SameType> createRoot2(SameType sameType) {
        return new JAXBElement<SameType>(new QName("urn:example", "root2"), SameType.class, sameType);
    }

}

相同类型

在此用例中,域类不需要注释。

package forum14845035;

public class SameType {

}

软件包信息

我们将利用包级别的XmlSchema注释来指定模型的命名空间限定。

@XmlSchema(namespace="urn:example", elementFormDefault=XmlNsForm.QUALIFIED)
package forum14845035;

import javax.xml.bind.annotation.*;

演示

package forum14845035;

import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(SameType.class, ObjectFactory.class);
        jc.generateSchema(new SchemaOutputResolver() {

            @Override
            public Result createOutput(String namespaceUri,
                    String suggestedFileName) throws IOException {
                StreamResult result = new StreamResult(System.out);
                result.setSystemId(suggestedFileName);
                return result;
            }

        });
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="urn:example" xmlns:tns="urn:example" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="root1" type="tns:sameType"/>

  <xs:element name="root2" type="tns:sameType"/>

  <xs:complexType name="sameType">
    <xs:sequence/>
  </xs:complexType>

</xs:schema>

有关更多信息

  • http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html
 类似资料:
  • 我认为这对真正理解JAXB绑定文件的人来说很容易... 如何配置JAXB将多个元素解组到同一个类中? 注意:我想避免在我的项目中添加另一个依赖项(比如MOXy)。理想情况下,这可以通过注释或自定义绑定文件来实现。 我有一个XML文档,其中包含许多相同元素的变体——每个元素都有完全相同的属性。使用下面的示例,我只关心“员工”,但XML指定了“董事、经理和员工”。为了我们的目的,这些都是同一个父类的子

  • 问题内容: 我认为对于真正了解JAXB绑定文件的人来说这很容易… 基本问题 如何配置JAXB将多个元素解组到同一类中? 注意:我想避免向我的项目中添加另一个依赖项(例如MOXy)。 理想情况下,这可以通过注释或自定义绑定文件来完成。 背景 我有一个XML文档,其中包含许多相同元素的变体,每个变体具有完全相同的属性。在下面的示例中,我只关心“雇员”,但是XML指定了“董事,经理和职员”。出于我们的目

  • 我发现的大部分stackoverflow结果都是用于序列化整个对象或反序列化的。我的一些想法… 是否可以从三个值字段中删除@SerializedName并只序列化不为null的值? 我是否可以在java中构建某种可选的数据类型对象,该对象基于具有值的数据类型进行设置? 这个对象是一个更大的对象的一部分,而subitems对象有一个相当大的深度,它只是一个注释。我希望这是一个重复的问题,我只是找不到

  • 我在使用JAXB解析XML时遇到了这个问题。下面是所讨论的XML的简化布局: 我遇到的问题是,这些引用是在linkage标记下发送的,而linkage标记不是唯一的,而且也没有类似于根的“linkage”,这样我就可以轻松地用Java将其包装到列表中,因为generalInformation标记中有其他标记。以下是我到目前为止的设置方式: 所以我的问题是,如何配置GeneralInformatio

  • 我正在尝试解组一个包含多个同名元素的XML文档。我不确定是否需要创建bean的Arraylist并将其传递给解组器。我希望有人能给我一些建议来解决这个问题。我试图解析的XML是一个SOAP响应,但我去掉了信封,所以我只有它的主体,它看起来是这样的: 这是从一个包含50多个字段的表返回的,但我创建了一个testBean,并且我定义了fkdevice只是为了使其简单,我的bean看起来像这样: 这给了

  • 问题内容: 我具有以下XML结构,该结构跨多个XML元素对单个概念进行建模。此格式不在我的控制范围内。 我想在一个数据库中,我确实有控制权,并可以有一个更简单的模型此表,和领域。因此,我想在课堂上解组。 可以通过注释自动完成吗?我目前正在使用JAXB解组到单独的列表和类列表,然后在上对瞬态进行后处理,但是我认为必须有一种更简便的自动方式来映射这些元素。还是XSLT的工作? 可能会知道XML是作为H