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

时间:2013-04-02 17:53:28

标签: java xml

我正试图弄清楚如何解决一个非常微不足道的问题。 我们假设我有两个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中的通配符只允许独立匹配所有标记)。

任何想法? 非常感谢!

1 个答案:

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