2012-08-08 70 views
0

我有如下的xml。解析XML並填充到地圖

<Employees> 
     <Employee id="1">Chuck</Employee> 
     <Employee id="2">Al</Employee> 
     <Employee id="3">Kiran</Employee> 
</Employees> 

XML包含employees.I的數量龐大提到只是爲了簡化。

什麼是解析這個XML並填充到地圖的最佳方式?地圖應該包含ID和名字對。

請提供更好的理解代碼。

+0

使用JDOM並逐一添加到'地圖<字符串,整數>'全體員工的條目。 – jn1kk 2012-08-08 19:45:36

+1

你有什麼嘗試?你知道SAX,DOM,XPATH等之間的區別...請在發佈之前搜索stackoverflow。我認爲這個問題已經回答了大約1000次。 – 2012-08-08 20:02:10

回答

1

我們可以簡單地使用Xstream進行映射。

XStream xStream = new XStream(new DomDriver()); 
xStream.alias("Employees", Employees.class); 
xStream.registerConverter(new MapEntryConverter()); 
employeesMap = (Map<String, String>) xStream.fromXML(queryXML); 

創建一個轉換器和解組XML要映射的對象

private static class MapEntryConverter implements Converter { 
     public boolean canConvert(Class clazz) { 
      return clazz.equals(Employees.class); 
     } 

     public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { 
      AbstractMap<String, String> map = (AbstractMap<String, String>) value; 
      for (Map.Entry<String, String> entry : map.entrySet()) { 
       writer.startNode(entry.getKey().toString()); 
       writer.setValue(entry.getValue().toString()); 
       writer.endNode(); 
      } 
     } 

     public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
      Map<String, String> map = new HashMap<String, String>(); 

      while (reader.hasMoreChildren()) { 
       reader.moveDown(); 
       map.put(reader.getAttribute(1), reader.getValue()); 
       reader.moveUp(); 
      } 
      return map; 
     } 
    } 

如下創建員工和僱員類。

private class Employees{ 
     List<Employee> employees; 
    } 
    private class Employee{ 
     private String id; 
     private String value; 
} 

希望這對你的作品。

1

使用XStream等庫。 List<Employee>適合在這裏比Map更好。

+0

如果OP不關心查找時間,'List'比'Map'好。 – 2012-08-08 19:48:00

+0

如何在'List'或'Map'上設置' – 2012-08-08 19:58:56

+0

我的要求是在Map中設置 – 2012-08-08 20:00:26

4

XStream answer看起來像很多代碼。你可以這樣做與在JDK/JRE StAX的API的以下內容:

package forum11871952; 

import java.io.FileReader; 
import java.util.*; 
import javax.xml.stream.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("src/forum11871952/input.xml")); 
     xsr.nextTag(); // advance to Employees tag 
     xsr.nextTag(); // advance to first Employer element 
     Map<String,String> map = new HashMap<String,String>(); 
     while(xsr.getLocalName().equals("Employee")) { 
      map.put(xsr.getAttributeValue("", "id"), xsr.getElementText()); 
      xsr.nextTag(); // advance to next Employer element 
     } 
    } 

}