在 JaxB 编组没有 @XmlRootElement 注释的元素时删除 ns2 前缀
Posted
技术标签:
【中文标题】在 JaxB 编组没有 @XmlRootElement 注释的元素时删除 ns2 前缀【英文标题】:Remove ns2 prefix while JaxB marshalling an Element without @XmlRootElement annotation 【发布时间】:2017-10-05 18:26:36 【问题描述】:我有一个要编组的对象,但架构没有 @XmlRootElement 注释。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public static class Foo
@XmlAttribute(name = "test1")
public final static String TEST_1 = "Foo";
@XmlElement(name = "Element1", required = true)
protected String element1;
@XmlElement(name = "Element2", required = true)
protected String element2;
我在编组时通过指定 JaxBElement 来编组对象
QName qName = new QName("", "Foo");
jaxb2Marshaller.marshal(new JAXBElement(qName, Foo.class, fooObj), new StreamResult(baos));
这会在编组后生成以下 XML
<Foo xmlns:ns2="http://Foo/bar" test1="Foo">
<ns2:Element1>000000013</ns2:Element1>
<ns2:Element2>12345678900874357</ns2:Element2>
</Foo>
对于我的用例,我想在没有 ns2 前缀的情况下整理这个对象,以便 XML 看起来像
<Foo xmlns="http://Foo/bar" test1="Foo">
<Element1>000000013</Element1>
<Element2>12345678900874357</Element2>
</Foo>
如何在没有前缀的情况下编组这个对象?
提前致谢。
【问题讨论】:
如果您使用 Java 8,请查看 post 【参考方案1】:首先,您在错误的命名空间中创建了 Foo
元素。查看所需的输出,您还希望 Foo
元素位于 http://Foo/bar
命名空间中。要解决此问题,请在创建 QName
时指定该命名空间 URI,而不是传递空字符串作为第一个参数:
// Wrong
QName qName = new QName("", "Foo");
// Right
QName qName = new QName("http://Foo/bar", "Foo");
要摆脱为命名空间生成的ns2
前缀,您需要将命名空间前缀设置为空字符串。您可能有一个带有@XmlSchema
注释的package-info.java
文件。它应该是这样的:
@XmlSchema(namespace = "http://Foo/bar",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns = @XmlNs(prefix = "", namespaceURI = "http://Foo/bar"))
package com.mycompany.mypackage;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
注意:设置 prefix = ""
将导致 JAXB 在您的 XML 中生成一个 xmlns
属性而没有生成的前缀名称,例如 ns2
。
【讨论】:
谢谢!我能够找到相同的解决方案,但您的解释有助于理解原因。以上是关于在 JaxB 编组没有 @XmlRootElement 注释的元素时删除 ns2 前缀的主要内容,如果未能解决你的问题,请参考以下文章