【问题标题】:Xpath match node with slash in data using predicateXpath 使用谓词在数据中匹配带有斜线的节点
【发布时间】:2010-11-16 19:09:10
【问题描述】:

问题源于使用 SoapUI 验证 xml 响应数据。我将问题转移到 XPath Visualizer,以便我可以解决这些问题。

使用 Xpath 查询我想返回子节点 b:ActivityDescription 值等于的 b:AccountActivity 节点 '7.75000%10/30-11-10 $1602' 来自下面的 xml 摘录。

这是我的 xpath 查询:

//b:AccountActivity[b:ActivityDescription = "7.75000%10/30-11/10    $1602"]

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <RetrieveAccountActivityResponse xmlns="http://tempuri.org/">
         <RetrieveAccountActivityResult xmlns:a="http://schemas.datacontract.org/2004/07/System.Collections.Generic" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:key xmlns:b="http://schemas.datacontract.org/2004/07/IntegratorSuite.DataContracts">
               <b:CurrentPage>0</b:CurrentPage>
               <b:Direction>Ascending</b:Direction>
               <b:PageSize>50</b:PageSize>
               <b:SortByParameter i:nil="true"/>
               <b:TotalEntries>4</b:TotalEntries>
               <b:TotalPages>1</b:TotalPages>
            </a:key>
            <a:value xmlns:b="http://schemas.datacontract.org/2004/07/IntegratorSuite.DataContracts">
               <b:AccountActivity>
                  <b:AccountNumber>11111111</b:AccountNumber>
                  <b:AccountType>2</b:AccountType>
                  <b:ActivityDescription>7.75000%10/30-11/10    $1602</b:ActivityDescription>
                  <b:Amount>4.1200000000</b:Amount>
                  <b:CallPut_HasValue>false</b:CallPut_HasValue>
                  <b:CallPut_Value>ALL</b:CallPut_Value>
                  <b:CmpQualCode i:nil="true"/>
                  <b:Currency>USD</b:Currency>
                  <b:Cusip></b:Cusip>
                  <b:Description1/>
                  <b:Description2/>
                  <b:EntryType>DC</b:EntryType>
                  <b:ExpirationDate>9999-12-31T23:59:59.9999999</b:ExpirationDate>
                  <b:JournalDescription i:nil="true"/>
                  <b:NetAmount>-4.1200000000</b:NetAmount>
                  <b:Price>0.000000</b:Price>
                  <b:PrincipalAmount>-4.1200000000</b:PrincipalAmount>
                  <b:Quantity>0.000000</b:Quantity>
                  <b:RecordType>H</b:RecordType>
                  <b:RootSymbol i:nil="true"/>
                  <b:SecQualCode i:nil="true"/>
                  <b:SecurityDescription>Cash</b:SecurityDescription>
                  <b:SecurityGroupCategoryID>0</b:SecurityGroupCategoryID>
                  <b:SecurityGroupDescription i:nil="true"/>
                  <b:SecurityQuantityConversion>0</b:SecurityQuantityConversion>
                  <b:SecurityTypeCode i:nil="true"/>
                  <b:StockConversionFactor>0</b:StockConversionFactor>
                  <b:StrikePrice>0.0</b:StrikePrice>
                  <b:Symbol/>
                  <b:SymbolCusip i:nil="true"/>
                  <b:TableID i:nil="true"/>
                  <b:TradeDate_HasValue>true</b:TradeDate_HasValue>
                  <b:TradeDate_Value>2010-11-11T00:00:00</b:TradeDate_Value>
                  <b:TradeDetailID_HasValue>false</b:TradeDetailID_HasValue>
                  <b:TradeDetailID_Value>0</b:TradeDetailID_Value>
                  <b:TradeNumber i:nil="true"/>
                  <b:TransactionType>Interest Collected</b:TransactionType>
                  <b:UnderlyingCusip i:nil="true"/>
                  <b:UnderlyingSymbol i:nil="true"/>
               </b:AccountActivity>
               <b:AccountActivity>
               ...

似乎节点值中的正斜杠是导致匹配失败的原因。如果我从 xml 和 xpath 查询中删除它们,我会得到一个匹配项。在节点值中匹配斜线是否存在一些问题?似乎是一个基本问题,但我找不到答案。

【问题讨论】:

  • 这有点奇怪,不是吗。我认为 xpath 没有一种方法可以转义除引号以外的字符串内容(您必须加倍)。这行得通吗://b:AccountActivity[b:ActivityDescription.text()="7.75000%10/30-11/10 $1602"]?我认为这不会有什么不同,但值得一试。
  • @allen:文字正斜杠与您的问题无关。您的 XPath 表达式具有正确的语法。也许问题出在您没有提供的代码中。命名空间前缀是否绑定到正确的命名空间 URI?
  • @Andrew - 是的,我试过双引号无济于事。
  • @Alejandro - 我将带有命名空间的文档顶部添加到帖子中。对于同一命名空间中的字段,我还有几个其他匹配项都可以正常工作,如果字段中的数据没有斜杠,则匹配项适用于该字段,所以我很确定它会以某种方式回到斜杠。
  • @Andrew:我无法重现这个问题。我正在使用 XPath Visualizer,它会选择所需的元素。

标签: xml xpath predicate slash


【解决方案1】:

事实证明,问题出在我发布的部分(正如 Alejandro 所建议的那样)下面的 xml 文档中。正在查询的元素的命名空间 URI 稍后在文档中被重新定义为不同的 URI。一旦将第二个命名空间更改为不同的唯一名称,xpath 就会按预期工作。由于某种原因,在文档后面重新定义 URI 会导致某些 xpath 工具出现异常行为,而当所需节点上方的字段数据中有斜杠时,其他工具不会出现异常行为。感谢大家的意见。下次我会发布整个文档:)。

【讨论】:

    【解决方案2】:

    我无法重现这个:

    【讨论】:

    • 嗯,可能是版本不同。我正在使用 1.2.1.6 桌面版的 XPath Visualizer。但它在 SoapUI 3.5.1 中也失败了。
    • @allen:您一定是在谈论其他一些完全不同的工具。我是 XPath Visualizer 的作者,没有像“桌面版”或1.2.1.6 版这样的东西。任何自称为“XPath Visualizer”但不是真正的工具的东西显然是非常不可靠的...... :)
    • @allen:当然这是假的 :)。真正的 XPath Visualizer 在这里:topxml.com/xpathvisualizer 请注意,该站点是一个幽灵,并且存在大量恶意软件。如果您没有安装好的反恶意软件工具,请不要访问此链接。
    • @Dimitre:我认为您应该将出色的应用程序上传到更好的主机。
    • @Alejandro:完全同意。我什至问过是否有人会提供他们的网站,但……从未收到过回复。
    【解决方案3】:

    正如 Alejandro 在他对该问题的评论中指出的那样,命名空间绑定在我用来测试此 xpath 的所有工具中都不起作用(xmlspy 除外)。然而,下面的 xpath 确实有效(我只是忽略了命名空间)。

    //*[local-name()='AccountActivity' and ./*[local-name()='ActivityDescription' and text()='7.75000%10/30-11/10    $1602']]
    

    【讨论】:

    • Greg,感谢您的意见,但不幸的是,我也无法让这个工作。我的意思不是听起来像一个损坏的记录,但唯一破坏这个 xpath 查询的是字段数据中是否有 /(斜杠)。该字段并不总是返回带有斜杠的数据,当它没有斜杠时,匹配工作完美(使用命名空间)。即使使用您在此处提供的示例,如果我在该字段中有没有斜杠的数据,它也可以工作。如果命名空间有问题,有人可以提出问题以及如何修复命名空间吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多