将命名空间添加到org.apache.camel.model.language.ExpressionDefinition.xpath(),默认命名空间不起作用

时间:2014-11-14 13:00:57

标签: xml soap xpath namespaces apache-camel

我遇到了xpath及其命名空间的问题。 我有如下肥皂信息:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
    <incident xmlns="some default namespace"
        xmlns:xmime="http://www.w3.org/2005/05/xmlmime" 
        xmlns:ns3="some namespace">
        <Company type="String">Test</Company>
    </incident>
</soap:Body>
</soap:Envelope>

我需要提供将公司名称与另一个字符串进行比较的xpath。 我的xpath是"/soap:Envelope/soap:Body/incident[Company='Test']",我在这部分代码中使用它:

org.apache.camel.model.language.ExpressionDefinition.xpath("/soap:Envelope/soap:Body/incident[Company='Test']",
                    beans.Xpath.createXpathNamespaces())

方法Xpath()。createXpathNamespaces()创建必要的命名空间:

    public static Namespaces createXpathNamespaces() {
        Namespaces namespaces = new Namespaces(Namespaces.DEFAULT_NAMESPACE, "some default namespace");
        namespaces.add("soap", "http://schemas.xmlsoap.org/soap/envelope/");
        namespaces.add("xmime", "http://www.w3.org/2005/05/xmlmime");
        namespaces.add("ns3", "some namespace");
    return namespaces;
}

这就是问题所在。 当肥皂没有包含这个部分(默认命名空间)时:xmlns="some default namespace"一切都很好; xpath在Company=specified name时返回true,在Test!=specified name时返回false但在将默认命名空间添加到soap xpath时返回false。 我有什么不对或是添加到xpath默认命名空间的其他方法吗? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

DEFAULT_NAMESPACE定义如下:

Namespaces.DEFAULT_NAMESPACE = "http://camel.apache.org/schema/spring";

因此,添加此命名空间不是您想要的:

Namespaces namespaces = new Namespaces(Namespaces.DEFAULT_NAMESPACE, "some default namespace");

选项1:没有命名空间的SOAP消息

如果从SOAP消息中删除(默认)命名空间:

<incident>

并使用XPath表达式而不对incidentCompany进行任何名称空间声明,然后这将匹配:

/soap:Envelope/soap:Body/incident[Company='Test']

选项2:具有命名空间的SOAP消息

但是,如果要为incidentCompany的SOAP消息添加名称空间声明:

<incident xmlns="some default namespace">

然后您还需要为XPath表达式添加名称空间前缀。与

Namespaces namespaces = new Namespaces("ns", "some default namespace");

你可以使用:

/soap:Envelope/soap:Body/ns:incident[ns:Company='Test']

如果它是默认命名空间或者在SOAP消息中声明显式命名空间并不重要,在这两种情况下都需要添加命名空间XPath表达式。