2013-04-02 2 views
-1

나는 아주 사소한 문제를 해결하는 방법을 알아 내려고하고 있습니다. xml 문서의 두 가지 "계열"즉 "요청"및 "응답"이 있다고 가정 해 보겠습니다.태그 이름이 특정 문자열로 끝나는 모든 XML 노드를 얻는 방법

에 "요청"속하는 문서처럼, "요청"로 끝나는 적어도 하나의 태그 이름이이 하나

<MyMessage> 
    <doSomethingRequest> 
     ... 
    </doSomethingRequest> 
    ... 
</MyMessage> 

분명히에 "응답"에 속하는 메시지가 될 것

<MyMessage> 
    <doSomethingResponse> 
     ... 
    </doSomethingResponse> 
    ... 
</MyMessage> 

이제 질문은 매우 쉽습니다. 메시지가 두 가족 중 하나에 속하면 어떻게 효율적으로 이해할 수 있습니까? 내가 좋아하는 뭔가를 시도했습니다

:

public static String getMessageFamily(Document xml){ 
    if(xml.getElementsByTagName("*Request").getLength() != 0){ 
     return "I'm a Request!"; 
    } else if(xml.getElementsByTagName("*Response").getLength() != 0){ 
     return "I'm a Response!"; 
    } else { 
     return "don't know who I am"; 
    } 
} 

하지만 분명히이 작동하지 않습니다는 (사실 나는이 org.w3c.dom.Document에서 와일드 카드 때문에 작동하지 않는 경우에만 모든 태그를 일치 독립 수 있습니다 꽤 확신했다).

아이디어가 있으십니까? 감사합니다.

답변

1

지적했듯이 질문은 간단합니다. 답은 XPath를 사용하고 함수는 ~로 끝납니다.

public static String getMessageType(Document xml) { 
    try { 
     xpathFactory = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); 
     XPath xpath = xpathFactory.newXPath(); 


     XPathExpression searchRequest = xpath.compile("//*[ends-with(name(),'Request')]"); 
     XPathExpression searchResponse = xpath.compile("//*[ends-with(name(),'Response')]"); 
     NodeList requestResult = (NodeList) searchRequest.evaluate(xml, XPathConstants.NODESET); 
     NodeList responseResult = (NodeList) searchResponse.evaluate(xml, XPathConstants.NODESET); 

     if(requestResult.getLength() != 0) return "REQ"; 
     if(responseResult.getLength() != 0) return "RESP"; 
    } catch (XPathExpressionException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (XPathFactoryConfigurationException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
관련 문제