2010-11-16 30 views
1

Problème survenu lors de l'utilisation de SoapUI pour valider les données de réponse XML. J'ai transféré le problème à XPath Visualizer pour que je puisse résoudre les problèmes.Nœud de correspondances Xpath avec barre oblique dans les données à l'aide du prédicat

utilisant une requête XPath Je veux retourner le b: AccountActivity de noeud qui a le nœud enfant b: ActivityDescription valeur égale à '7,75000% 10/30-11-10 $ 1602' de l'extrait xml ci-dessous .

C'est ma requête 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> 
       ... 

Il semble que la barre oblique de la valeur du nœud est ce qui est à l'origine du match à l'échec. Si je supprime ceux de la requête xml et xpath, j'obtiens une correspondance. Y a-t-il un problème avec les barres obliques correspondantes dans les valeurs de noeud? On dirait une question fondamentale mais je ne trouve pas de réponse.

+0

C'est un peu étrange, n'est-ce pas? Je ne pense pas que xpath ait un moyen d'échapper au contenu des chaînes autres que les citations (que vous devez doubler). Est-ce que cela fonctionne: '//b:AccountActivity[b:ActivityDescription.text()="7.75000%10/30-11/10 $ 1602"] '? Je ne pense pas que cela devrait faire la différence, mais ça vaut le coup d'essayer. –

+1

@allen: la barre oblique littérale n'a rien à voir avec votre problème. Votre expression XPath a la syntaxe riht. Peut-être que le problème est dans le code que vous n'avez pas fourni. Les préfixes de namespaces sont-ils liés à l'URI de l'espace de nom de droite? –

+0

@Andrew - oui j'ai essayé des guillemets en vain. – allen

Répondre

3

Il se trouve que le problème était dans le document XML ci-dessous (en dessous) de la partie I posté (comme Alejandro suggéré). L'URI d'espace de nom de l'élément interrogé était redéfini dans un autre URI plus tard dans le document. Une fois que le deuxième espace de noms a été changé en un nom unique différent, le xpath fonctionne comme prévu. Pour une raison quelconque, la redéfinition de l'URI plus tard dans le document a provoqué le comportement anormal dans certains outils xpath et pas d'autres lorsque les données de champ au-dessus du nœud souhaité contenaient une barre oblique. Merci pour l'apport de tout le monde. La prochaine fois que je vais poster l'ensemble du document :).

1

Je ne peux pas reproduire ce:

alt text

+0

Eh bien, pourrait être la différence dans la version. J'utilise la version 1.2.1.6 de XPath Visualizer. Mais il échoue également dans SoapUI 3.5.1. – allen

+0

@allen: Vous devez parler d'un autre outil complètement différent. Je suis l'auteur de XPath Visualizer et il n'y a rien de tel que "version de bureau" ou version 1.2.1.6. Tout ce qui s'appelle "XPath Visualizer" et n'est pas le vrai outil est évidemment assez peu fiable ... :) –

+0

@Dimitre - Cochez ici: http://xpathvisualizer.codeplex.com/. – allen

0

Comme Alejandro a souligné dans son commentaire à la question, l'espace de noms de liaison ne fonctionne pas dans tous les outils utilisés pour tester cette XPath (sauf XMLSpy). Cependant le xpath suivant a fonctionné (j'ai simplement ignoré les espaces de noms).

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

Greg, merci pour votre contribution, mais malheureusement, je ne peux pas faire fonctionner celui-ci non plus. Je ne veux pas ressembler à un enregistrement rayé, mais la seule chose qui casse cette requête xpath est s'il y a une barre oblique/(barre oblique) dans les données du champ. Ce champ ne renvoie pas toujours des données avec des barres obliques et lorsqu'il n'y a pas de barre oblique, la correspondance fonctionne parfaitement (avec les espaces de noms). Même avec l'exemple que vous avez fourni ici, cela fonctionne si j'ai des données dans ce champ sans barres obliques. S'il y a un problème avec les espaces de noms, quelqu'un peut-il suggérer ce qui ne va pas et comment réparer les espaces de noms? – allen