Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取标记名以特定字符串结尾的所有XML节点_Java_Xml - Fatal编程技术网

Java 如何获取标记名以特定字符串结尾的所有XML节点

Java 如何获取标记名以特定字符串结尾的所有XML节点,java,xml,Java,Xml,我正在想办法解决一个非常琐碎的问题。 让我们假设我有两个xml文档“家族”:“请求”和“响应” 属于“请求”的文档至少有一个以“请求”结尾的标记名,如下所示: <MyMessage> <doSomethingRequest> ... </doSomethingRequest> ... </MyMessage> 但显然这不起作用(实际上我很确定这不起作用,因为org.w3c.dom.Document中的通配

我正在想办法解决一个非常琐碎的问题。 让我们假设我有两个xml文档“家族”:“请求”和“响应”

属于“请求”的文档至少有一个以“请求”结尾的标记名,如下所示:

<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;
    }
}