Xpath匹配节点,使用谓词在数据中使用斜杠

时间:2010-11-16 19:09:11

标签: xml xpath predicate slash

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

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

这是我的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查询中删除那些我得到一个匹配。节点值中是否存在匹配斜杠的问题?似乎是一个基本问题,但我找不到答案。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我无法重现

alt text

答案 2 :(得分:0)

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

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