我有一个要编码的对象,但是架构没有@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>

我如何将没有前缀的对象编码?

提前致谢。

最佳答案

首先,您在错误的 namespace 中创建了Foo元素。查看所需的输出,您还希望Foo元素位于http://Foo/bar命名空间中。要解决此问题,请在创建QName时指定该 namespace URI,而不要传递空字符串作为第一个参数:

// Wrong
QName qName = new QName("", "Foo");

// Right
QName qName = new QName("http://Foo/bar", "Foo");

要摆脱为命名空间生成的ns2前缀,您需要将命名空间前缀设置为空字符串。您可能有一个带有package-info.java批注的@XmlSchema文件。它看起来应该像这样:
@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生成xmlns属性,而XML中没有生成的前缀名称,例如ns2

10-07 19:32
查看更多