【问题标题】:select one of many attributes from xml element using xpath使用 xpath 从 xml 元素中选择许多属性之一
【发布时间】:2014-05-23 17:03:03
【问题描述】:

我需要使用 xPATH 提取 xml 标记之一包含的众多属性之一。 我得到了一个 xml 有效负载,我正在运行的是一个骡子应用程序。 这是我拥有的示例 xml。

<?xml version="1.0" encoding="UTF-8" ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bme:version="1-0" xsi:schemaLocation="">
<env:Header>
</env:Header>
<env:Body>
        <smrst:abc xmlns:smrst="http://abc.xyz.com/2013/123-model-result" xmlns:smc="http://abc.xyz.com/2013/123-model-core" smc:applcode="123" smc:appInter="abc" smc:applicationId="123456ACV 20121203000000001239" smc:bC="111" smc:bT="GHJ" smc:ent="GHJ123" smc:mT="ASDFGH" smc:NH="33" smc:BH="0">

</env:Body>
</env:Envelope>

上面的示例 xml 我想提取 smc:NH 值和 smc:BH 值 uisng xpath。

这是我尝试过的并获得空值。请指导我。

<logger message="value for hit 1'st #[xpath:Envelope/Body/abc/@smc:NH]" level="INFO" doc:name="Logger"/>

当我尝试关注时,我收到一个错误,不确定我错过了什么。

<logger message="value for hit #[xpath:/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='abc']/@applcode]" level="INFO" doc:name="Logger"/>

顺便说一句,这些只是日志语句,我需要提取值并将其设置为另一个变量。

【问题讨论】:

  • “我得到一个错误” - 什么错误?
  • /'@applicationCode' 中的属性名称中删除引号'

标签: xml xpath mule


【解决方案1】:

为您的 xpath 正在寻找的命名空间添加 mule xml 命名空间管理器,如下所示。

<xm:namespace prefix="env"  uri="http://www.w3.org/2003/05/soap-envelope" />

<xm:namespace prefix="smrst"  uri="http://abc.xyz.com/2013/123-model-result" />         

<xm:namespace prefix="smc"  uri="http://abc.xyz.com/2013/123-model-core" />         

然后如下更改您的 xpath。

#[xpath://env:Envelope/env:Body/smrst:abc/@smc:NH]

希望这会有所帮助。

【讨论】:

  • 我在 mule xml 配置中添加了命名空间。如下所示
  • 我将命名空间添加到 mule 配置中,并更改了您提到的 xpath 表达式。但我现在收到以下错误。无法解析命名空间前缀“env”(org.jaxen.UnresolvableException)。这就是在我的 mule-xml 配置中添加新命名空间的方式。 xmlns:env="w3.org/2003/05/soap-envelope" xmlns:smrst="abc.xyz.com/2013/abc-model-result" xmlns:smc="abc.xyz.com/2013/abc-model-core" 这就是 xpath 现在的样子。 #[xpath://env:Envelope/env:Body/smrst:SanctionsResult/@smc:applicationCode]
  • 我正在使用 xPATH 表达式来忽略命名空间值 但这会返回 null。知道我错过了什么吗?
  • @user2160677 您是按照 user1760178 的建议添加了那些 xm:namespace 条目,还是仅添加了您在该评论中粘贴的内容?
  • 使用 namespacemanager 将命名空间添加到 mule config 后,您是否可以正常工作。
【解决方案2】:

您的示例XML 存在几个问题。

  1. 与元素类型“env:Envelope”关联的属性“bme:version”的前缀“bme”未绑定。
  2. 元素类型&lt;smrst:abc&gt; 未以结束标记终止。

首先更正XML,然后将命名空间管理器添加到您的 mule 配置中

   <xm:namespace-manager>
        <xm:namespace prefix="env" uri="http://www.w3.org/2003/05/soap-envelope" />
        <xm:namespace prefix="smrst" uri="http://abc.xyz.com/2013/123-model-result" />
        <xm:namespace prefix="smc" uri="http://abc.xyz.com/2013/123-model-core" />
    </xm:namespace-manager>

然后这样做XPath:

&lt;logger message="Value of NH is: #[xpath('//env:Envelope/env:Body/smrst:abc/@smc:NH').value]" level="INFO" /&gt;

【讨论】:

    【解决方案3】:

    正如其他人所指出的那样,您要么需要声明命名空间并正确使用命名空间前缀,要么使用 local-name() 处理所有内容,就像你已经为元素所做的那样:

    <logger message="value for hit #[xpath:/*[local-name()='Envelope']
                                           /*[local-name()='Body']
                                           /*[local-name()='abc']
                                           /@*[local-name() = 'applcode']" 
            level="INFO" doc:name="Logger"/>
    

    就个人而言,我建议按照其他人的建议正确声明和使用命名空间前缀。

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多