如何从杰克逊 XML 解析中删除命名空间定义

Posted

技术标签:

【中文标题】如何从杰克逊 XML 解析中删除命名空间定义【英文标题】:How to remove namespace definition from jackson Xml parsing 【发布时间】:2015-05-23 18:26:52 【问题描述】:

我正在使用 Jackson 数据格式将 Pojos 序列化为 XML。

它工作正常,但我想删除命名空间定义:

@JacksonXmlRootElement(localName="simple_something")
public class Simple 
    public int x = 1;
    public int y = 2;

我愿意:

ObjectMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(new Simple());

我明白了:

<simple_something xmlns="">
  <x>1</x>
  <y>2</y>
</simple_something>

但我想删除 xmlns=""

它看起来像

<simple_something>
  <x>1</x>
  <y>2</y>
</simple_something>

有什么想法吗?

【问题讨论】:

【参考方案1】:

确保使用Woodstox Stax 实现,而不是 Stax 实现 Oracle 与 JDK 捆绑。这通常通过添加 Maven 依赖项以显式包含 woodstox jar 来完成。 这在https://github.com/FasterXML/jackson-dataformat-xml/的 XML 模块自述文件中进行了解释

Oracle 的实现出于某种原因在命名空间修复模式中添加了该声明。它也更慢并且有更多的错误,所以没有太多理由依赖它,除非你真的想最小化外部依赖。

还要注意,命名空间声明是完全无害的,因此虽然没有必要,但它是合法的 XML。因此,虽然看起来很碍眼,但所有 xml 工具都应该可以与这些额外的声明一起正常工作。

【讨论】:

我已经添加了woodstock pom依赖,它仍然保持一个空的xmlns属性。 我也做了同样的事情,但也没有用。我还使用 WstxInputFactory 和 WstxOutputFactory 初始化了我的 XmlMapper,如 GitHub 页面所示。​​ 如果这是最新的(2.9.10 或 2.10.0),woodstox 作为依赖项,可能有意义地提出问题的重现(理想情况下是单元测试)问题。虽然没有害处,但不应编写该命名空间声明。

以上是关于如何从杰克逊 XML 解析中删除命名空间定义的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XML 元素中删除一个特定的命名空间

如何从输出 xml 中删除命名空间?

如何使用 java dom 从 xml 中删除命名空间?

如何从 WEB API 请求和响应 XML 中删除命名空间?

使用 Python Etree 解析 XML 并返回指定的标签而不考虑命名空间

从 XML 中删除多个 XML 命名空间