【问题标题】:Flatten JaxB objects展平 JaxB 对象
【发布时间】:2015-12-03 20:30:51
【问题描述】:

我有一个非常复杂的 xml 结构,像这样

<root>
 <a>
   <b>
      <c>testc</c> 
      <e>teste</e>
   <b>
   <d>testd</d>
 </a>
...
</root>

有超过 100 个节点。节点很简单,没有属性。我正在使用 xjc(JaxB 绑定编译器)从 xsd 文件生成 POJO 对象。但是因为 xsd 有一个树结构 xjc 正在生成 100 个对象。

我可以将 xjc 生成的输出展平,并拥有一个具有所有属性的对象,如下所示:

class Root {
 private String c;
 private String e;
 private String d;
 ...
}

而不是 100 个对象?

理想情况下,我会对使用这个概念进行编组和解组感兴趣!

【问题讨论】:

  • 可以添加 XSD 吗?

标签: jaxb xjc


【解决方案1】:

有some documentation on cyclic references,但我无法从您的 XML 中判断这是否是问题所在。

您可以使用您的平面Root 方法,但您会因为忽略容器标签而失去重现原始结构的能力。 您可以进行很多配置,甚至可以编写自己的片段(反)序列化程序,但在某些情况下,尝试将 XML 树放入单节点 JAXB POJO 时会变得过于复杂。

据我所知,您只对能够编辑带有文本内容的单字母标签的值感兴趣。或许您可以通过使用 XSLT 将源文档转换为将 1 对 1 映射到 POJO 的文档来简化您的界面,但您还必须编写反向 XSLT。

另一种方法是简单地将 XML 加载到通用 DOM 中,并使用 XPath(如 //a/text())访问可编辑节点。您可能已经对属性使用了 getter 和 setter,因此您可以让它们调用 private getText( String tagName ) 和 private setText( String tagName, String value) 来直接读取和修改 DOM。这些函数只需使用Document.getElementsByTagName 和Node.(get|set)TextContent。

【讨论】:

  • 感谢您的意见。我没有循环问题。我只需要很多领域,我正在尝试尽可能地自动化。使用 DOM 不是解决方案,因为我正在处理大型文档。 XSLT 也会让我手动编写映射,我正在努力避免这种情况。
  • 如果 DOM 比 JAXB 太大 - 整个树将在内存中,只是使用不同的模型。如果内存是一个问题,请查看XStream。否则,您将不得不编写一些代码来处理模型的复杂性——它是一个树结构,而不是一个平面列表。显示 XSD;如果在生成的代码中存在冗余而不是在 XSD 中,您可以通过添加一些注释来减少它。
猜你喜欢
  • 2014-01-05
  • 2021-03-05
  • 2019-05-25
  • 2021-12-25
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2020-10-23
相关资源
最近更新 更多