【问题标题】:using Guava Multimap to represent xml names and values使用 Guava Multimap 表示 xml 名称和值
【发布时间】:2011-12-10 02:07:10
【问题描述】:

如何使用 Guava Multimap 来表示以下 xml:

<node key="abc123">some value</node>
<node key="asdf22">
   <node key="as234">some value343</node>
   <node key="sggg234">some value234234</node>
</node>

在我的 xml 文件中,90% 的时间给定节点元素不会有内部节点(以防我可以优化?)。

我想要的是一个 KeyValuePair 集合,其中的值是另一个 keyValuePair 集合。

在 c# 中我可以做到:

public List<string,List<KeyValuePair<string,string>>> nodes;

我被告知要查看 Guava 的多图,但不知道如何正确使用它,有人可以帮助我吗?

顺便说一句,由于 90% 的情况我不需要将值作为另一个列表,我可以针对这种情况进行优化吗?

【问题讨论】:

  • 您试图表示两种不同的数据类型,字符串或节点集合。普通的 XML 解析器会使用文本节点作为内部文本;您可以创建一个与您展示的 C# 示例相同的地图,但您将如何存储其中只有文本的第一个节点?除非你有一个特殊的值(null?),否则当没有节点时,显示的结构不会立即对我有意义。

标签: java collections guava


【解决方案1】:

不确定 MultiMap 是否最适合您在此处描述的内容。多重映射是您对同一个键有多个值的地方。这不是您的 XML 所描述的。您的 XML 描述了一个层次结构,其中每个值都有一个路径,可能有多个连接在一起的键来描述它在层次结构中的位置。

从建模的角度来看,我会考虑使用两种类型的 XML 节点。 1 保存值,另一个保存节点(想想文件与目录)。您需要切换您的 XML,以便在两种不同类型之间做出清晰的划分。这样解析起来会更容易。

所以,粗略的伪代码..

class Container {
  private Map<String,String> keyValuePairs;
  private Map<String,Container> children;
}

这会给你无限的深度。每个容器都可以保存 keyValue 对以及其他容器。顶级节点应该是根容器。递归应该是微不足道的。按键/分隔符的遍历也应该很容易。

可能比您需要的更灵活。根据需要进行修剪。

您也可以合并值/容器的概念,但是您的建模会变得有点难看。这是一个权衡。

【讨论】:

  • 我无法控制 xml。
  • 这很不幸,但不是表演的终结者。它只是让解析变得更加复杂,但仍然可行。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2012-10-28
  • 1970-01-01
  • 2015-04-30
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多