我正在尝试确定正确的XPath表达式,以返回xsi:type
元素上Body
属性的值。我没有运气就尝试了所有的东西。根据我读到的内容,这似乎很接近,但显然不是正确的。任何快速指导,以便我终于可以休息了吗?
//v20:Body/@xsi:type
我希望它返回v20:SmsMessageV1RequestBody
<v20:MessageV1Request>
<v20:Header>
<v20:Source>
<v20:Name>SOURCE_APP</v20:Name>
<v20:ReferenceId>1326236916621</v20:ReferenceId>
<v20:Principal>2001</v20:Principal>
</v20:Source>
</v20:Header>
<v20:Body xsi:type="v20:SmsMessageV1RequestBody">
<v20:ToAddress>5555551212</v20:ToAddress>
<v20:FromAddress>11111</v20:FromAddress>
<v20:Message>TEST</v20:Message>
</v20:Body>
</v20:MessageV1Request>
答案 0 :(得分:2)
正如评论中指出的,你有两个选择:
local-name()
引用目标节点而不考虑名称空间以下是如何在Java中执行后者:
XPath xpath = XPathFactory.newInstance().newXPath();
NamespaceContext ctx = new NamespaceContext() {
public String getNamespaceURI(String prefix) {
if ("v20".equals(prefix)) {
return "testNS1";
} else if ("xsi".equals(prefix)) {
return "http://www.w3.org/2001/XMLSchema-instance";
}
return null;
}
public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}
public Iterator getPrefixes(String uri) {
throw new UnsupportedOperationException();
}
};
xpath.setNamespaceContext(ctx);
XPathExpression expr = xpath.compile("//v20:Body/@xsi:type");
System.out.println(expr.evaluate(doc, XPathConstants.STRING));
请注意,我假设以下命名空间声明:
<v20:MessageV1Request xmlns:v20="testNS1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
您需要更新getNamespaceURI
才能使用实际值。
答案 1 :(得分:0)
所有好的答案/反馈。我的实际问题似乎已经解决了,一天晚上和早上的新建。我将通过反馈加强。谢谢大家。