2011-11-28 3 views
2

를 사용하여 을 나열하려면 :추출 XML 정보는 내가 다음 예에서와 같은 SOAP 응답에서 XML 데이터를 XPath를

나는 Map(KEY,VALUE) KEY=tagname, VALUE=value 의 각 직원에 대한 정보를 저장하고를 만들려 할
<EMP> 
    <PERSONAL_DATA> 
    <EMPLID>AA0001</EMPLID> 
    <NAME>Adams<NAME> 
    </PERSONAL_DATA> 
    <PERSONAL_DATA> 
    <EMPLID>AA0002<EMPLID> 
    <NAME>Paul<NAME> 
    </PERSONAL_DATA> 
</EMP> 

Java에서 XPATH를 사용하는 모든 직원에 대해 LIST<MAP>. 어떻게 이뤄지나요?

public static List createListMap(String path, SOAPMessage response,Map map) { 
      List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();  
       try { 
       XPath xpath = XPathFactory.newInstance().newXPath(); 
       XPathExpression expr = xpath.compile("//" + path + "/*"); 
       Object re =expr.evaluate(response.getSOAPBody(), XPathConstants.NODESET); 
       NodeList nodes = (NodeList)res;       
       for (int i = 0; i < nodes.getLength(); i++) { 
        if (nodes.item(i).getFirstChild() != null && 
         nodes.item(i).getFirstChild().getNodeType() == 1) { 
         Map<String, Object> map1 = new HashMap<String, Object>(); 
         map.put(nodes.item(i).getLocalName(), map1); 
         createListMap(nodes.item(i).getNodeName(), response,map1); 
         list.add(map);     
        } 
        else { 
         map.put(nodes.item(i).getLocalName(),nodes.item(i).getTextContent());             
        } 
return list;     
} 

내가 (응답이 SoapResponse입니다) createListMap("EMP",response,map); 같은 방법을 호출 :

나는 다음 시도했다. XPATH //PERSONAL_DATA/*에 문제가 발생했습니다. 재귀에서 두 직원에 대한 데이터가 나열되어 있지만 각 직원의 데이터를 자체 맵에 저장 한 다음 해당 MAP의 LIST를 작성하려고합니다. 어떻게해야합니까?

답변

2

표현식 //PERSONAL_DATA/*PERSONAL_DATA 요소의 모든 하위 요소를 선택하여 설명하는 문제를 발생시킵니다. 대신 PERSONAL_DATA 요소를 선택하고 해당 요소를 반복합니다.

예 :

public NodeList eval(final Document doc, final String pathStr) 
     throws XPathExpressionException { 
    final XPath xpath = XPathFactory.newInstance().newXPath(); 
    final XPathExpression expr = xpath.compile(pathStr); 
    return (NodeList) expr.evaluate(doc, XPathConstants.NODESET); 
} 

public List<Map<String, String>> fromNodeList(final NodeList nodes) { 
    final List<Map<String, String>> out = new ArrayList<Map<String,String>>(); 
    int len = (nodes != null) ? nodes.getLength() : 0; 
    for (int i = 0; i < len; i++) { 
     NodeList children = nodes.item(i).getChildNodes(); 
     Map<String, String> childMap = new HashMap<String, String>(); 
     for (int j = 0; j < children.getLength(); j++) { 
      Node child = children.item(j); 
      if (child.getNodeType() == Node.ELEMENT_NODE) 
       childMap.put(child.getNodeName(), child.getTextContent()); 
     } 
     out.add(childMap); 
    } 
    return out; 
} 

하는 것은 다음과 같이 사용합니다 :

List<Map<String, String>> nodes = fromNodeList(eval(doc, "//PERSONAL_DATA")); 
System.out.println(nodes); 

출력 :

[{NAME=Adams, EMPLID=AA0001}, {NAME=Paul, EMPLID=AA0002}] 

당신이 실제로 추가 중첩 된 요소로, 더 복잡한 구조를 처리하는 경우 (당신이 의심 스럽다면), 레이어를 따로 따로 반복하거나 일부를 사용하여 데이터를 모델링해야합니다. JAXB과 같은 것.

+1

대단히 감사합니다. – Sandeep