2009-10-03 5 views
0

Мне нужно разобрать xml в HashMap, где «ключ» - это объединение двух атрибутов элементов. XML-выглядит следующим образом:Анализ в HashMap с помощью Commons Digester

<map> 
    <parent key='p1'><child key='c1'> value1</child></parent> 
    <parent key='p2'><child key='c2'> value1</child></parent> 
</map> 

В 1-й записи карты, я хочу поставить «p1.c1'as ключ карту при„значению1“в качестве значения карты. Как это сделать?

ответ

1

Пример использования Xstream (http://x-stream.github.io/). Он не полностью соответствует вашей спецификации XML, я добавил вложенные теги <value> в теги <child>.

Выход:

<map> 
    <parent key="p1"> 
    <child key="c1"> 
     <value>value1</value> 
    </child> 
    </parent> 
    <parent key="p2"> 
    <child key="c2"> 
     <value>value1</value> 
    </child> 
    </parent> 
</map> 
p1.c1=value1 
p2.c2=value1 

ли эта помощь? В противном случае проследите за ними.

import java.util.HashMap; 

import com.thoughtworks.xstream.XStream; 
import com.thoughtworks.xstream.io.xml.DomDriver; 

public class MapParser { 

    public static void main(String[] args) { 

     XStream xstream = new XStream(new DomDriver()); 
     xstream.alias("map", Map.class); 
     xstream.addImplicitCollection(Map.class, "parents"); 
     xstream.alias("parent", Parent.class); 
     xstream.useAttributeFor(Parent.class, "key"); 
     xstream.alias("child", Child.class); 
     xstream.useAttributeFor(Child.class, "key"); 

     Map map = (Map) xstream 
       .fromXML("<map><parent key='p1'><child key='c1'><value>value1</value></child></parent><parent key='p2'><child key='c2'><value>value1</value></child></parent></map>"); 

     System.out.println(xstream.toXML(map)); 

     java.util.Map result = new HashMap(); 
     for (Parent parent : map.getParents()) { 

      Child child = parent.getChild(); 
      String key = parent.getKey() + "." + child.getKey(); 
      result.put(key, child.getValue()); 
      System.out.println(key + "=" + child.getValue()); 
     } 
    } 
} 


import java.util.ArrayList; 
import java.util.List; 

public class Map { 

    private List<Parent> parents = new ArrayList<Parent>(); 

    public void addParent(Parent parent) { 
     parents.add(parent); 
    } 

    public List<Parent> getParents() { 
     return this.parents; 
    } 
} 

public class Parent { 

    private String key; 
    private Child child; 

    public Parent(String key) { 
     this.key = key; 
    } 

    public Child getChild() { 
     return child; 
    } 

    public void setChild(Child child) { 
     this.child = child; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 
} 


public class Child { 

    private String key; 
    private String value; 

    public Child(String key) { 
     this.key = key; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 
+0

Позвольте мне попробовать, спасибо – ariso

+0

, но ... есть ли какое-либо решение, используемое в варочном котле? он работает на 99% случаев. И это тот, который мы не можем обработать в варочном котле. – ariso

+0

Покажите нам код! Это облегчит вам помощь. –

0

У вас возникли проблемы с выбором и использованием синтаксических анализаторов XML?

+0

Нет 100%, я хочу использовать утилиту apache commons digester для этого. он работает для единой иерархии. но для объекта с несколькими иерархиями. Вопрос в том, как получить родительское ключевое имя, дочернее имя и объединить их? – ariso

1

Общий дайджест Apache на самом деле не является полностью парсером, а иногда очень медленным ... Если вам приходится иметь дело с большими документами XML, вы, вероятно, захотите проверить расширенный VTD-XML, который поддерживает до 256 ГБ XML, он также поддерживает карту памяти, позволяя частичную загрузку документа XmL

1

Решено. пользователь расширяет правило hashmap.