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

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

濮俭
2023-03-14

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

共有1个答案

郑俊美
2023-03-14

TL;速度三角形定位法(dead reckoning)

在@XmlSchema上设置 elementFormDefault=XmlNsForm.QUALIFIED 时,可以通过用 @XmlType(namespace=“ANOTHER_NAMESPACE”) 对类的属性进行批注来覆盖该类属性的命名空间。如果要重写根元素的命名空间,可以执行@XmlRootElement(namespace=“DIFFERENT_NAMESPACE)”。

详细信息

    < Li > http://blog . bdoughan . com/2010/08/JAXB-namespaces . html

JAVA模型

酒吧

您只需要在< code>@XmlType注释上为< code>Bar类设置名称空间。

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.*;

该对象是您的域模型的根。

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模式

以下是您通过http://jsfiddle.net/supertonsky/Phck5/.提供的XML模式

Foo.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="FOO2"
    xmlns:tns="FOO2" 
    xmlns:tns2="FOO"
    elementFormDefault="qualified">
    <import namespace="FOO" schemaLocation="BAR.xsd"></import>
    <element name="foo" type="tns:Foo"></element>
    <complexType name="Foo">
        <sequence>
            <element name="bar" type="tns2:Bar"></element>
        </sequence>
    </complexType>
</schema>

Bar.xsd

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

演示代码

下面的演示代码将创建一个域对象的实例,并将其输出到XML。在针对您提供的XML架构进行封送处理操作的过程中,将对XML输出进行验证。

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);
    }

}

输出

然后您将获得以下输出。请注意与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>
 类似资料:
  • 问题内容: 我想要的是绿色背景位于文本的后面,而不是页面宽度的100%。这是我当前的代码: 问题答案: 将文本放在嵌入式元素中,例如。 然后将背景颜色应用于内联元素。 内联元素与其内容一样大,因此应该为您完成。

  • 使用MediaQuery类及其数据属性,我想为整个应用程序设置textScaleFactor,但是我不能在MaterialApp之前获得上下文。

  • 如何设置第一个类为xxx的样式? 问题:比如我要设置第一个拥有red的元素的样式,css如何选中

  • 我试图一次为一个元素设置多个属性。我找到了这个答案,以及对那个答案的这个评论。在那里的JSFiddle中,他不使用字符串作为属性名,与使用字符串的答案相反。 我在第7行添加了以下内容: 但是我得到了以下错误: 未捕获的引用Error:未定义html 评论JSFiddle(已编辑)

  • 在我的一个项目中,我们支持使用XML进行数据输入。由于XML是一个用户输入文件,它很有可能是一个有效的XML,但有一些语义错误(例如字符串长度大于允许的限制等)。 目前我正在使用javax。xml。验证。Validator验证给定文档,但即使一个元素有语义错误,也会失败。我想要的是能够跳过这些元素,而不是跳过整个XML。我知道我们可以为验证器设置一个错误处理程序,我可以在其中跳过此类错误,但这意味

  • 1、物流公司设置 商家在系统后台 设置->配送管理->物流配送,注意设置完成物流公司,一定要设置运费模版。 1)商家可以在后台添加物流公司名称,编码,联系电话,物流公司logo,对物流公司进行排序,以及对添加的物流公司进行修改、删除等管理操作。 注意:输入对应快递查询的物流公司编码,可以到快递鸟,快递100官网下载物流公司编码表。 2)商家设置物流是否启用,可以编辑物流信息,关闭或开启物流。 3)