【问题标题】:Using Jackson to parse XML with repeated element使用 Jackson 解析具有重复元素的 XML
【发布时间】:2020-12-11 19:28:34
【问题描述】:

我正在寻找一种使用 Jackson 来解析具有重复元素的 XML 结构的简单方法。这是一个简化的例子:

<root>
   <a>
       <x>
           <b>some content</b>
           <c>some content</c>
       </x>
       <x>
           <b>some content</b>
           <c>some content</c>
       </x>    
       ...
       <x>
           <b>some content</b>
           <c>some content</c>
       </x>
   </a>

   ... some other content ...
</root>

我想在一个列表或数组中收集所有x 元素问题是当使用类似的东西时:

XmlMapper().readTree(xml).get("a").fields()

结果仅包含x 的最后一个实例,因此看起来某些映射键被覆盖了。有一个使用JsonParser的解决方案 例如:XmlMapper().createParser(xml) 但它有点恶心。

有没有更好的办法?

编辑

按照我阅读README 中“已知限制”部分的方式,XML 似乎是杰克逊的二等公民。我接受@galuszkak 的回答,因为它是这样的,但在我看来,当开发人员调用XmlMapper().readTree(xml) 时,他们不希望XML 处理被硬塞到JSON 处理模型中,因为这种方法会受到限制。

【问题讨论】:

    标签: java xml kotlin jackson


    【解决方案1】:

    这里提到的问题在这个 Github issue 中有描述: https://github.com/FasterXML/jackson-dataformat-xml/issues/187

    基本上发生的事情是,Jackson 正在 JsonNode 数据模型中翻译 XML 树结构,这将不起作用,因为它不受支持。

    该 Github 问题中描述了 2 个选项:

    • 将此 XML 完全转换为 JSON(来自 Github 上 @cawena 的回答)
    • 或者,如果您知道自己的数据结构,只需使用来自 p0sitron 的答案:

    代码:

    List<List<JsonNode>> elA = xmlMapper.readValue(xml, new TypeReference<List<List<JsonNode>>>() { });
    assertEquals(3, elA.get(0).size());
    

    【讨论】:

    • 谢谢,顺便说一句,“试图在 JsonNode 数据模型中使用 XML 树结构”的人不是我——而是杰克逊。
    • @DavidSoroko 我理解这听起来如何,如果没有得到很好的解释/接受,我深表歉意。实际上,您可以通过多种方式使用 Jackson,使用方式表明将其转换为 JsonNode。我编辑了我的答案以更好地反映所问的内容。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2021-09-19
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多