【问题标题】:JAXB Marshaller - How do I suppress xmlns namespace attributes?JAXB Marshaller - 如何抑制 xmlns 命名空间属性?
【发布时间】:2012-03-22 19:36:52
【问题描述】:

我使用 JAXB2 为使用 maven 3、jaxb2、FIXML 模式和 maven-jaxb2-plugin 的独立 Java 应用程序生成 XML。当我编组 XML 时,输出根元素中包含 xmlns 属性。如何删除它?

发件人:

<root ... xmlns="http://www.fixprotocol.org/FIXML-4-4">...</root>

收件人:

<root ... >...</root>

编辑:

包信息.java

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.fixprotocol.org/FIXML-4-4", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.package;

【问题讨论】:

  • 您的 Root.java 对象所在的包文件夹中是否有 package.java 文件,或者您的 Root 对象上有哪些 JAXB 注释?
  • 我有 package-info.java。我已经更新了问题以包含它。 maven-jaxb2 插件生成这些代码。 Root.java 有 XmlAccessorType、XmlElement、XmlAttribute 注释。

标签: java xml jaxb maven-jaxb2-plugin


【解决方案1】:

因此,如果您不希望包含命名空间信息,您可以从 package-info.java 中删除 @XmlSchema 注释。

这在某种程度上破坏了您的自动构建,尽管正如您所说,这是从 maven 插件自动生成的。

建议您查看插件选项,看看您是否可以从输出中删除它,或者您必须使用一些额外的插件来删除该行,或者将 package-info.java 一起删除。

问题 - 您是否要将此 XML 传递给期望包含命名空间信息的服务?我想我对你为什么要剥离命名空间信息感兴趣。

【讨论】:

  • 我们向其发送 XML 的外部客户端专门要求我们将其删除。不知道为什么。我会研究你提到的选项或替代方案,如果有任何工作......
【解决方案2】:

现在通过从生成的 jaxb2 代码中删除对命名空间“http://www.fixprotocol.org/FIXML-4-4”的所有引用解决了这个问题。这是粗制滥造的。我希望有一种更自动化的方式。

【讨论】:

  • 你能想出一个自动化的方法吗?
  • 不,对我来说这不值得,这是一次性的事情。所以我手动做了。如果您找到解决方案,请告诉我。
【解决方案3】:

为了使过程自动化,您只需从源 xsd 文件中删除属性 targetNamespace

【讨论】: