-1

我试图弄清楚如何解决一个非常琐碎的问题。假设我有两个“家族”的 xml 文档:“请求”和“响应”。

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

<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只允许独立匹配所有标签)。

任何的想法?非常感谢!

4

1 回答 1

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;
    }
}
于 2013-04-02T19:58:54.553 回答