6

这可能与JAXB Marshaller 有关 - 如何抑制 xmlns 命名空间属性?

但我的问题有点不同。我进行常规的 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{
....
}

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

我查看了我的 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但这适用于更改前缀。我无法让它完全删除命名空间。这让我困扰了一天。

4

1 回答 1

3

我现在也有类似的要求。对我有用的唯一解决方案是实现 XMLStreamWriter 的包装器。

请在此处查看我的答案。我还描述了我尝试过的其他解决方案。

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

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();
于 2016-06-29T10:09:03.067 回答