【问题标题】:WSO2 XPATH always returns nullWSO2 XPATH 总是返回 null
【发布时间】:2015-02-27 03:47:17
【问题描述】:

这是我的问题。我从具有事件触发器的 DS 接收到以下 xml 到 ESB。

<messageCollection xmlns="http://services.core.solution.com/ds/queue">
   <message>
      <messageid>3083e5b9-f8fd-426f-a017-42439f47eefc</messageid>
      <messagetypeid>1</messagetypeid>
      <message>''</message>
      <processed>false</processed>
      <createddate>2014-12-30T14:38:11.782-04:00</createddate>
      <modifieddate>2014-12-30T14:38:11.782-04:00</modifieddate>
      <count>7</count>
   </message>
    <message>
      <messageid>2283e5b9-f8fd-426f-a017-42439f47eefc</messageid>
      <messagetypeid>2</messagetypeid>
      <message>''</message>
      <processed>false</processed>
      <createddate>2014-12-30T14:38:11.782-04:00</createddate>
      <modifieddate>2014-12-30T14:38:11.782-04:00</modifieddate>
      <count>7</count>
   </message>
</messageCollection>

并且在有效负载调解中我正在实现这个:

<payloadFactory media-type="xml">
    <format>
        <p:updateLastPollingControl xmlns:p="http://services.core.solution.com/ds/queue">
            <xs:lastpolling xmlns:xs="http://services.core.solution.com/ds/queue">$1</xs:lastpolling>
        </p:updateLastPollingControl>
    </format>
    <args>
        <arg evaluator="xml" expression="//ns:message[last()]/ns:createddate" /> </args>
</payloadFactory>

为什么它总是返回空值。如果我对日期进行编码,一切正常。

在一个绝望的举动中我也尝试了:

> //ns:message[last()]/ns:createddate/text() 
> /*/ns:message[last()]/ns:createddate   
> //ns:message[last()]/createddate
> /*/message[last()]/createddate

但似乎没有任何效果。

有什么想法吗?谢谢

【问题讨论】:

    标签: xpath wso2 wso2esb soa synapse


    【解决方案1】:

    (免责声明:我不熟悉 WSO2,只熟悉 XML/XPath。)

    在我看来,您的问题是由于 XML 输入中的 默认命名空间

    <messageCollection xmlns="http://services.core.solution.com/ds/queue">
    

    这个默认命名空间不仅适用于messageCollection 元素,还适用于它的所有后代,包括message 元素。另外,即使在命名空间中,message 的元素名称仍然是“message”,而不是“ns:message”。

    此外,我看不到您在哪里声明或注册命名空间http://services.core.solution.com/ds/queue,即将它与前缀ns: 相关联。如果不这样做,则前缀和命名空间之间没有任何联系。

    要检验这个假设,请尝试

    //*:message[last()]/*:createddate
    

    //*[local-name() = 'message'][last()]/*[local-name() = 'createddate']
    

    如果这些表达式返回任何内容,请告诉我。


    上面的表达式并没有真正考虑命名空间,而是忽略了它们。处理命名空间的正确方法是声明它们。根据this page,也许注册这个命名空间的正确方法是

    <args>
       <arg evaluator="xml" expression="//ns:message[last()]/ns:createddate" xmlns:ns="http://services.core.solution.com/ds/queue"/>
    </args>
    

    【讨论】:

    • 这个 //*[local-name() = 'message'][last()]/*[local-name() = 'createddate'] 是一个神奇的!谢谢
    【解决方案2】:

    只是一个想法,因为这仅在不同的设置下进行了测试,但也许您可以检查以下内容: 我刚刚在版本中测试了你的 XPath

    //*/message[last()]/createddate/text()
    

    结果为@​​987654322@

    然后我检查了结果

    //*/message[last()]
    

    它不仅返回最后一条消息,而是返回

    <message>''</message>
    <message>
      <messageid>2283e5b9-f8fd-426f-a017-42439f47eefc</messageid>
      <messagetypeid>2</messagetypeid>
      <message>''</message>
      <processed>false</processed>
      <createddate>2014-12-30T14:38:11.782-04:00</createddate>
      <modifieddate>2014-12-30T14:38:11.782-04:00</modifieddate>
      <count>7</count>
    </message>
    <message>''</message>
    

    实际上都是 last() 消息节点 - 两个消息的两个内部 &lt;message&gt;''&lt;/message&gt; 节点和消息容器中的最后/第二个消息。要获得第二条消息,遵循 XPath 对我有用:

    //*/message[not(parent::message)][last()]
    

    选择没有父消息的last() 消息。因此,也许您可​​以尝试使用名称空间调整版本的 createddate

    //*/message[not(parent::message)][last()]/createddate/text()
    

    因为 WSO2 XPath 的行为可能与我使用的 XPath 测试器不同,后者已经使用前面提到的表达式检索了 createddate。

    【讨论】:

    • 感谢您的快速回复。我测试了这里列出的所有 xpath,但都失败了。我真的相信这实际上是因为命名空间。如果我使用呈现的 xml 并将其加载到具有命名空间的测试器中,则结果为空,如果我消除了 ns,我得到的正是你所得到的。所以我尝试在wso2中添加ns:形式的命名空间,但是每次尝试都不成功。还有其他想法吗?
    • @Ray 很抱歉听到这个消息,我只是想我最好分享一下这个想法,以防它在 wso2 中为你工作。在某人(可以在 wso2 中测试)有正确的想法之前,不应该花太长时间。祝你好运!
    【解决方案3】:

    您需要将ns 前缀绑定到调解器配置中的正确命名空间,如下所示:

    <arg xmlns:ns="http://services.core.solution.com/ds/queue" ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2016-11-02
      • 2014-05-06
      • 2012-06-05
      • 2014-05-30
      • 2014-02-23
      • 2017-10-12
      相关资源
      最近更新 更多