在编组jaxb时从根元素中删除xmlns属性

时间:2013-04-03 19:17:48

标签: java xml jaxb xml-namespaces jaxb2-maven-plugin

这可能与JAXB Marshaller - How do I suppress xmlns namespace attributes?

有关

但我的问题有点不同。 我做常规的java编组,我的xsd没有名称空间。生成的xml也没有名称空间,除了根元素。

<?xml version="1.0" encoding="UTF-8"?><rootElement xmlns:ns2="unwanted namespace">

unwanted namespace来自同一个项目的另一个模式,我不确定为什么会在这个阶段接收到它。

由jaxb2-maven-plugin生成的我的rootElement.java看起来像:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"feed"
})
@XmlRootElement(name = "rootElement", namespace = "")
public class RootElement{
....
}

此时我想要的是从生成的xml中删除xmlns:ns2="unwanted namespace"属性,我正在努力解决它。

我查看了我的package-info.java,看起来像是:

@javax.xml.bind.annotation.XmlSchema(namespace = "unwanted namespace", elementFormDefault =   javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.mypackage;

我尝试添加-npa但由于某种原因它无法在jaxb2-maven-plugin上运行。我尝试了NamespaceMapper,但这适用于更改前缀。我无法完全删除名称空间。这让我困扰了一天。

1 个答案:

答案 0 :(得分:1)

我目前有类似的要求。唯一对我有用的解决方案是为XMLStreamWriter实现一个包装器。

请看一下我的回答here。我还描述了我试过的其他解决方案。

使用上面链接中的代码进行序列化如下所示:

XMLOutputFactory factory = XMLOutputFactory.newFactory();

StringWriter writer = new StringWriter(XML_BUFFER_INITIAL_SIZE);
XMLStreamWriter xmlWriter = null;

try {
  xmlWriter = factory.createXMLStreamWriter(writer);
  JAXBContext context = JAXBContext.newInstance(MyJAXBGeneratedClass.class);
  Marshaller marshaller = context.createMarshaller();
  marshaller.marshal(reportContainer, new NamespaceStrippingXMLStreamWriter(xmlWriter));
  xmlWriter.flush();
}
finally {
  if (xmlWriter != null)
    xmlWriter.close();
}

return writer.toString();