Java 如何获取标记名以特定字符串结尾的所有XML节点
我正在想办法解决一个非常琐碎的问题。 让我们假设我有两个xml文档“家族”:“请求”和“响应” 属于“请求”的文档至少有一个以“请求”结尾的标记名,如下所示:Java 如何获取标记名以特定字符串结尾的所有XML节点,java,xml,Java,Xml,我正在想办法解决一个非常琐碎的问题。 让我们假设我有两个xml文档“家族”:“请求”和“响应” 属于“请求”的文档至少有一个以“请求”结尾的标记名,如下所示: <MyMessage> <doSomethingRequest> ... </doSomethingRequest> ... </MyMessage> 但显然这不起作用(实际上我很确定这不起作用,因为org.w3c.dom.Document中的通配
<MyMessage>
<doSomethingRequest>
...
</doSomethingRequest>
...
</MyMessage>
但显然这不起作用(实际上我很确定这不起作用,因为org.w3c.dom.Document
中的通配符只允许独立匹配所有标记)
有什么想法吗?
非常感谢 正如所指出的,问题很简单,答案也很简单:使用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;
}
}
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";
}
}
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;
}
}