使用 xpath 获取 xsi:type 的值 [关闭]

Posted

技术标签:

【中文标题】使用 xpath 获取 xsi:type 的值 [关闭]【英文标题】:Get value of xsi:type with xpath [closed] 【发布时间】:2012-02-07 09:08:30 【问题描述】:

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

【问题讨论】:

Xpath 表达式对我来说看起来不错。您是在 XQUERY、XSLT 还是其他东西中使用这个 XPath?这里问题的最可能原因是命名空间前缀引起的混乱。消除命名空间造成混淆的一种方法是将 xpath 重写为: //*[local-name() eq 'Body']/@*[local-name() eq 'type'] Murray 是对的,因为在 XPath 中处理命名空间通常有两种方法 - 第一种:使用 local-name()namespace-uri() XPath 函数,第二种:使用 XPath 引擎的适当机制 - 例如对于标准 JAXP,您必须使用正确配置的 NamespaceContext,它将前缀映射到命名空间。 【参考方案1】:

正如 cmets 中指出的,您有两种选择:

    使用local-name() 引用目标节点而不考虑命名空间 使用 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 以使用实际值。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于使用 xpath 获取 xsi:type 的值 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 xpath 检索属性名称中包含冒号的属性的值

Xpath 匹配一个节点并获取它的值

使用 XPath 在使用 python 的 <td> 单元格中获取文本

如何使用XSLT映射删除xsi:type =“xsd:string”&xsi:nil =“true”?

dom4j支持Xpath的具体操作

无法在路径中使用 <xsi:type=> 设置 SQL XML 节点级别