Java 在JaxB编组不带@XmlRootElement注释的元素时删除ns2前缀

Java 在JaxB编组不带@XmlRootElement注释的元素时删除ns2前缀,java,xml,jaxb,prefix,Java,Xml,Jaxb,Prefix,我有一个要处理的对象,但该模式没有@XmlRootElement注释 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "") public static class Foo { @XmlAttribute(name = "test1") public final static String TEST_1 = "Foo"; @XmlElement(name = "Element1", required = tru

我有一个要处理的对象,但该模式没有@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));
<Foo xmlns:ns2="http://Foo/bar" test1="Foo">
    <ns2:Element1>000000013</ns2:Element1>
    <ns2:Element2>12345678900874357</ns2:Element2>
</Foo>
这将在编组后生成以下XML

QName qName = new QName("", "Foo");
jaxb2Marshaller.marshal(new JAXBElement(qName, Foo.class, fooObj), new StreamResult(baos));
<Foo xmlns:ns2="http://Foo/bar" test1="Foo">
    <ns2:Element1>000000013</ns2:Element1>
    <ns2:Element2>12345678900874357</ns2:Element2>
</Foo>

000000013
12345678900874357
对于我的用例,我希望不使用ns2前缀来标记这个对象,这样XML看起来就像

<Foo xmlns="http://Foo/bar" test1="Foo">
    <Element1>000000013</Element1>
    <Element2>12345678900874357</Element2>
</Foo>

000000013
12345678900874357
如何在没有前缀的情况下封送此对象


提前感谢。

首先,您在错误的命名空间中创建了
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生成
xmlns
属性,而不在XML中生成前缀名称,如
ns2

谢谢!我能够得到相同的解决方案,但您的解释有助于理解原因