2013-04-02 3 views
-1

Я пытаюсь выяснить, как решить очень тривиальную проблему. Предположим, что у меня есть два «семейства» xml-документов: «запросы» и «ответы».Как получить все узлы XML с именем тега, заканчивающимся определенной строкой

Документа, принадлежащий к «запросам» имеет по крайней мере одно имя тега, который заканчивается «Request», как это:

<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, с функцией end-with.

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; 
    } 
} 
Смежные вопросы