7

我正在尝试确定正确的 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>
4

2 回答 2

2

正如评论中指出的那样,您有两种选择:

  1. 用于local-name()引用目标节点而不考虑命名空间
  2. 使用 XPath 引擎正确注册所有命名空间

以下是如何在 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以使用实际值。

于 2012-01-11T19:01:23.503 回答
0

所有很好的答案/反馈。我的实际问题似乎已经解决了一个晚上和早上的新构建。我将通过反馈进行改进。谢谢大家。

于 2012-01-11T19:47:18.030 回答