我遇到了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默认命名空间的其他方法吗?
提前谢谢。
答案 0 :(得分:1)
DEFAULT_NAMESPACE
定义如下:
Namespaces.DEFAULT_NAMESPACE = "http://camel.apache.org/schema/spring";
因此,添加此命名空间不是您想要的:
Namespaces namespaces = new Namespaces(Namespaces.DEFAULT_NAMESPACE, "some default namespace");
如果从SOAP消息中删除(默认)命名空间:
<incident>
并使用XPath表达式而不对incident
和Company
进行任何名称空间声明,然后这将匹配:
/soap:Envelope/soap:Body/incident[Company='Test']
但是,如果要为incident
和Company
的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表达式。