【发布时间】: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,它会选择所需的元素。