我正试图弄清楚如何解决一个非常微不足道的问题。 我们假设我有两个xml文档的“族”:“请求”和“响应”。
属于“requests”的文档至少有一个以“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
中的通配符只允许独立匹配所有标记)。
任何想法? 非常感谢!
答案 0 :(得分: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;
}
}