使用 xpath 获取 xsi:type 的值

发布于 2024-12-25 22:33:26 字数 880 浏览 1 评论 0原文

我正在尝试确定正确的 XPath 表达式以返回 Body 元素上的 xsi:type 属性的值。我已经尝试了似乎所有的事情,但没有运气。根据我读到的内容,这似乎很接近,但显然并不完全正确。有什么快速指导可以让我最终安息吗?

//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>

I am trying to determine the correct XPath expression to return the value of the xsi:type attribute on the Body element. I have tried what seems like everything without luck. Based on what I read this would seem close but it is obviously not quire correct. Any quick guidance so that I can put finally to rest?

//v20:Body/@xsi:type

I want it to return 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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

神仙妹妹 2025-01-01 22:33:26

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

  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 以使用实际值。

As was pointed out in the comments, you have two choices:

  1. Use local-name() to reference the target nodes without regard for namespaces
  2. Properly register all namespaces with the XPath engine

Here's how to do the latter in 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));

Note that I'm assuming the following namespace declarations:

<v20:MessageV1Request xmlns:v20="testNS1" 
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

You'll need to update getNamespaceURI to use the actual values.

神仙妹妹 2025-01-01 22:33:26

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

All great answers/feedback. My actual issue seems have resolved itself with a night away and fresh build in the morning. I will be enhancing with the feedback. Thanks all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文