JAXB 编组:更改应声明命名空间的元素

Posted

技术标签:

【中文标题】JAXB 编组:更改应声明命名空间的元素【英文标题】:JAXB marshalling: change element which should declare a namespace 【发布时间】:2014-04-01 11:13:00 【问题描述】:

当使用 JAXB 编组时,我对 哪个元素 命名空间/命名空间前缀将被声明影响吗?

目前,所有命名空间前缀都在根元素中声明,但由于处理我的 XML 的系统的奇怪限制,我需要在子元素中声明它们(这仍然会产生有效的 xml 文档)。

早在 2006 年就向 official jaxb issue tracker and declined by a developer 提出了类似但不相同的请求。我想知道这种情况是否在此期间发生了变化,或者是否存在一些解决方法。

感谢任何帮助。

示例:

JAXB 编组创建以下 XML:

<outer xmlns:ns1="http://mydomain">
  <inner>
     <ns1:data/>
  </inner>
</outer>

虽然我需要类似的东西 (ns1 前缀在根元素中声明):

<outer>
  <inner xmlns:ns1="http://mydomain">
     <ns1:data/>
  </inner>
</outer>

【问题讨论】:

您能发布一个预期的 XML 示例吗? @Priyesh 我已经更新了问题 您可能会发现这很有用。 jaxb.java.net/nonav/2.2.1/docs/vendorProperties.html。检查文档中的方法getPreDeclaredNamespaceUris() 谢谢,但是这种方法对于逆问题很有用:jaxb 1.0,它或多或少地像我需要的那样工作 - 在首先需要它的元素上声明命名空间。然后可以使用此方法在根元素处设置命名空间声明。 如果从方法中返回一个空数组会发生什么? 【参考方案1】:

JAXB (JSR-222) 不提供控制命名空间声明发生位置的方法。 JAXB 提供者倾向于将命名空间放在根元素上(出于性能原因),但它们不是必需的。

下面是我对类似问题给出的答案的链接,其中XMLStreamWriter 被扩展以控制何时报告命名空间声明。

JAXB marshalling XMPP stanzas

【讨论】:

虽然我只考虑建议的 XMLStreamWriter 方式作为一种解决方法,但它似乎是解决我的问题的唯一兼容方式 - 谢谢。

以上是关于JAXB 编组:更改应声明命名空间的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何获取JAXB对象的命名空间

Xml Jaxb 命名空间和属性顺序

重命名元素的 XSLT 问题——更改命名空间

JAXB:需要所有元素的命名空间前缀

如果命名空间声明在 SOAP 信封上,如何使用 JAXB 解组 SOAP 响应?

使用命名空间和前缀的 JAXB 解组