с использованием Guava Multimap для представления имен и значений XML - PullRequest
1 голос
/ 10 декабря 2011

Как я могу использовать 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, где значением является другая коллекция keyValuePairs.

В c # я мог бы сделать:

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

Я былсказал посмотреть на мультикарту Гуавы, но не уверен, как правильно ее использовать, может кто-нибудь мне помочь?

Кстати, так как в 90% случаев мне не нужно, чтобы значение было другим списком, могу ли якак-то оптимизировать под эту ситуацию?

1 Ответ

2 голосов
/ 10 декабря 2011

Не уверен, что MultiMap лучше всего подходит для того, что вы здесь описали. Мультикарта - это то, где у вас есть несколько значений для одного и того же ключа. Это не то, что описывает ваш XML. Ваш XML описывает иерархию, в которой у каждого значения есть путь, возможно, с несколькими конкатенациями ключей, описывающих его местоположение в иерархии.

С точки зрения моделирования я хотел бы рассмотреть возможность использования двух типов узлов XML. 1 содержит значения, а другой содержит узлы (например, файлы против каталогов). Вам нужно будет переключить свой XML, чтобы четко разграничить два разных типа. Так будет проще разобрать.

Итак, в грубом псевдо-коде ..

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

Это дает вам бесконечную глубину. Каждый контейнер может содержать пары keyValue, а также другие контейнеры. Узел верхнего уровня должен быть корневым контейнером. Рекурсия должна быть тривиальной. Обход по ключу / разделителю также должен быть легким.

Возможно, более гибкий, чем вам нужно. Обрезать по мере необходимости.

Вы также можете объединить концепцию значений / контейнеров, но тогда ваше моделирование станет немного уродливее. Это компромисс.

...