Java 如何在单个类的基础上设置JAXB中元素的elementFormDefault,而不是为整个包设置它?

Java 如何在单个类的基础上设置JAXB中元素的elementFormDefault,而不是为整个包设置它?,java,xml,jaxb,schema,Java,Xml,Jaxb,Schema,我知道我可以使用@XmlSchema来实现这一点,但问题是我们在同一个包中有一个类,它需要其名称空间不同于package-info.java上定义的名称空间。因此,我们在@XmlRootElement中声明了名称空间(当然,在@XmlSchema仍然存在的情况下)。但是这样做不允许我们设置类的elementFormDefault。将类移动到其他包不是一个选项。基本上,我只想覆盖这个特定类的名称空间;DR 当在@XmlSchema上设置elementFormDefault=XmlNsForm.QU

我知道我可以使用@XmlSchema来实现这一点,但问题是我们在同一个包中有一个类,它需要其名称空间不同于package-info.java上定义的名称空间。因此,我们在@XmlRootElement中声明了名称空间(当然,在@XmlSchema仍然存在的情况下)。但是这样做不允许我们设置类的elementFormDefault。将类移动到其他包不是一个选项。基本上,我只想覆盖这个特定类的名称空间;DR

当在
@XmlSchema
上设置
elementFormDefault=XmlNsForm.QUALIFIED
时,您可以通过使用
@XmlType(namespace=“另一个_名称空间”)
对类的属性进行注释来覆盖该名称空间。如果要覆盖根元素的命名空间,可以执行
@XmlRootElement(namespace=“DIFFERENT_namespace)

了解更多信息


JAVA模型

您只需要在
类的
@XmlType
注释上设置名称空间

package forum14579814;

import javax.xml.bind.annotation.XmlType;

@XmlType(namespace="FOO")
public class Bar {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
套餐信息

这将覆盖在包级别
@XmlSchema
注释中指定的命名空间

@XmlSchema(namespace="FOO2", elementFormDefault=XmlNsForm.QUALIFIED)
package forum14579814;

import javax.xml.bind.annotation.*;
Foo

此对象是域模型的根

package forum14579814;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private Bar bar;

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar bar) {
        this.bar = bar;
    }

}
XML模式

下面是您通过提供的XML模式

Foo.xsd

输出

然后您将获得以下输出。请注意,与
Bar
上的
name
属性相对应的
name
元素是如何使用
FOO
命名空间限定的,而所有其他元素是如何使用
FOO2
命名空间限定的

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:foo xmlns="FOO" xmlns:ns2="FOO2">
    <ns2:bar>
        <name>BAR</name>
    </ns2:bar>
</ns2:foo>

酒吧

你差一点就击中了它。请原谅,如果我有时在问正确的问题时很差劲。实际上,我的问题是,就像在你的例子中一样,我希望类栏保持
合格的
(如
包信息.java
中所述)即使我通过
@XmlType
@XmlRootElement
设置其名称空间。通过查看给定的XML,类
似乎处于
不合格的形式,即使
包信息.java
将其设置为
合格的
(如果我错了,请纠正我).@supertonsky-
Bar
是命名空间限定的。在该示例中,doc恰好对应于默认命名空间。我尝试使用@XmlRootElement将
Foo
的命名空间更改为
FOO2
,并从Bar中删除了命名空间声明。发生的情况是Foo变得不限定。我得到了
Bar
,我得到了它s不再是限定形式。因此,当我根据限定的架构验证它时,它失败。@supertonsky-
Foo
仍然是限定的。
Foo
元素用名称空间
FOO2
限定,元素
bar
name
Foo
名称空间限定。元素h输出一个与默认名称空间(
xmlns=
FOO“`)对应的前缀。谢谢Blaise,但我确实认为它是不合格的。我已经为此创建了模式,生成的XML没有通过模式验证。以下是链接:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="FOO"
    xmlns:tns="FOO" 
    elementFormDefault="qualified">
    <complexType name="Bar">
        <sequence>
            <element name="name" type="string" maxOccurs="1" nillable="true"></element>
        </sequence>
    </complexType>
</schema>
package forum14579814;

import java.io.File;

import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.validation.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class);

        Bar bar = new Bar();
        bar.setName("BAR");

        Foo foo = new Foo();
        foo.setBar(bar);

        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = schemaFactory.newSchema(new File("src/forum14579814/Foo.xsd"));

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setSchema(schema);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:foo xmlns="FOO" xmlns:ns2="FOO2">
    <ns2:bar>
        <name>BAR</name>
    </ns2:bar>
</ns2:foo>