2014-12-18 2 views
6

У меня есть пример XML Я хочу, чтобы разобратькак разобрать xml на hashmap?

<?xml version="1.0" encoding="utf-8"?> 

<Details> 
    <detail-a> 

     <detail> attribute 1 of detail a </detail> 
     <detail> attribute 2 of detail a </detail> 
     <detail> attribute 3 of detail a </detail> 

    </detail-a> 

    <detail-b> 
     <detail> attribute 1 of detail b </detail> 
     <detail> attribute 2 of detail b </detail> 

    </detail-b> 


</Details> 

Я хотел бы от этого XML, чтобы написать метод, который будет разбирать его HashMap, что ключ является строкой, а значение представляет собой список строк ,

, например: ключ «детализируют» значение = { «атрибут 1 детализации а», «атрибут 2 детализации а», «атрибут 3 детали А»}

и так далее ..

Каков наилучший способ сделать это? потому что я запутался: \

Я получил это далеко, чтобы попытаться напечатать деталь-а и детальность-б, но я получаю пустой ...

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 

     DocumentBuilder builder; 
     try { 
      builder = factory.newDocumentBuilder(); 
      File f= new File("src/Details.xml"); 
      Document doc=builder.parse(f); 
      Element root=doc.getDocumentElement(); 
      NodeList children=root.getChildNodes(); 
      for(int i=0;i<children.getLength();i++) 
      { 
       Node child=children.item(i); 
       if (child instanceof Element) 
       { 
        Element childElement=(Element) child; 
        Text textNode=(Text)childElement.getFirstChild(); 
        String text=textNode.getData().trim(); 
        System.out.println(text); 

       } 
      } 

     } catch (ParserConfigurationException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
+0

Вы попробовали что-нибудь? –

+0

XStream будет полезен – sol4me

+0

вы можете преобразовать xml в строку, а затем вы можете сохранить его в hashmap –

ответ

3

Использование JAXB для чтения из xml и сохранить его в пользовательский объект.

Пользовательский класс объекта:

import java.util.List; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlRootElement(name = "Details") 
@XmlType(propOrder = { "detailA", "detailB" }) 
public class Details { 
    private List<String> detailA; 
    private List<String> detailB; 

    public void setDetailA(List<String> detailA) { 
     this.detailA = detailA; 
    } 

    @XmlElementWrapper(name = "detail-a") 
    @XmlElement(name = "detail") 
    public List<String> getDetailA() { 
     return detailA; 
    } 

    public void setDetailB(List<String> detailB) { 
     this.detailB = detailB; 
    } 

    @XmlElementWrapper(name = "detail-b") 
    @XmlElement(name = "detail") 
    public List<String> getDetailB() { 
     return detailB; 
    } 
} 

Извлечение данных из вашего XML в объект, а затем добавить содержимое на карту по желанию:

public static void main(String[] args) throws JAXBException, FileNotFoundException { 
    System.out.println("Output from our XML File: "); 
    JAXBContext context = JAXBContext.newInstance(Details.class); 
    Unmarshaller um = context.createUnmarshaller(); 
    Details details = (Details)um.unmarshal(new FileReader("details.xml")); 
    List<String> detailA = details.getDetailA(); 
    List<String> detailB = details.getDetailB(); 

    Map<String, String[]> map = new HashMap<String, String[]>(); 
    map.put("detail-a", detailA.toArray(new String[detailA.size()])); 
    map.put("detail-b", detailB.toArray(new String[detailB.size()])); 


    for (Map.Entry<String, String[]> entry : map.entrySet()) { 
     //key "detail a" value={"attribute 1 of detail a","attribute 2 of detail a","attribute 3 of detail a"} 
     System.out.print("Key \"" +entry.getKey()+"\" value={"); 
     for(int i=0;i<entry.getValue().length;i++){ 
      if(i!=entry.getValue().length-1){ 
       System.out.print("\""+entry.getValue()[i]+"\","); 
      } 
      else{ 
       System.out.print("\""+entry.getValue()[i]+"\"}"); 
      } 
     } 
     System.out.println(); 
    } 
} 

выход будет:

 
Output from our XML File: 
Key "detail-a" value={"attribute 1 of detail a","attribute 2 of detail a","attribute 3 of detail a"} 
Key "detail-b" value={"attribute 1 of detail b","attribute 2 of detail b"} 

В качестве примечания: это будет работать только для xml, который вы предоставили в качестве ввода в свой вопрос, если вам нужно добавить более подробную информацию например detail-c и т. д., вы также должны определить их в своем пользовательском объекте.

XML используется:

<?xml version="1.0" encoding="utf-8"?> 
<Details> 
    <detail-a> 
     <detail>attribute 1 of detail a</detail> 
     <detail>attribute 2 of detail a</detail> 
     <detail>attribute 3 of detail a</detail> 
    </detail-a> 
    <detail-b> 
     <detail>attribute 1 of detail b</detail> 
     <detail>attribute 2 of detail b</detail> 
    </detail-b> 
</Details> 
2

Я не могу удержаться, чтобы представить более короткое решение, используя XMLBeam, который работает с любым количеством «деталь-х» подэлементов.

public class Tetst { 

@XBDocURL("resource://test.xml") 
public interface Projection { 
    @XBRead("name()") 
    String getName(); 

    @XBRead("./detail") 
    List<String> getDetailStrings(); 

    @XBRead("/Details/*") 
    List<Projection> getDetails(); 
} 

@Test 
public void xml2Hashmap() throws IOException { 
    HashMap<String, List<String>> hashmap = new HashMap<String, List<String>>(); 
    for (Projection p : new XBProjector().io().fromURLAnnotation(Projection.class).getDetails()) { 
     System.out.println(p.getName() + ": " + p.getDetailStrings()); 
     hashmap.put(p.getName(), p.getDetailStrings()); 
    } 
} 
} 

Это печатает

detail-a: [ attribute 1 of detail a , attribute 2 of detail a , attribute 3 of detail a ] 
detail-b: [ attribute 1 of detail b , attribute 2 of detail b ] 

для примера test.xml и заполняет HashMap.

Смежные вопросы