使用xpath获取xsi:type的值

时间:2012-01-10 23:20:44

标签: xml xpath xsd spring-integration eai

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

2 个答案:

答案 0 :(得分:2)

正如评论中指出的,你有两个选择:

  1. 使用local-name()引用目标节点而不考虑名称空间
  2. 使用XPath引擎正确注册所有名称空间
  3. 以下是如何在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)

所有好的答案/反馈。我的实际问题似乎已经解决了,一天晚上和早上的新建。我将通过反馈加强。谢谢大家。