2009-04-24 5 views
1

Je me bats avec la fonctionnalité de XPath BizTalk
- le message que je reçois a un espace de noms par défaut vide
- en C# Je rajouterais un NamespaceManager
- mais je ne vois pas comment je peux le faire dans une expression BizTalk?XPath BizTalk avec un espace de noms par défaut et aucun préfixe

Tout ce que je ne pas faire est d'obtenir les valeurs des HasErrors et NumberOfErrors

<?xml version="1.0" encoding="utf-8"?> 
<ImportIndexDocumentResponse 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://www.aniteps.com/xml/schemas/awm/images4"> 
    <HasErrors>false</HasErrors> 
    <NumberOfErrors xsi:type="xsd:int">0</NumberOfErrors> 
    <ErrorDescription xsi:type="xsd:string">No exception ocurred.</ErrorDescription> 
    ... 
+0

Le titre de la question est trompeur. L'espace de noms par défaut est * not * vide. C'est "http://www.aniteps.com/xml/schemas/awm/images4". Ce que vous voulez dire est "sans préfixe d'espace de nommage". –

+0

Merci pour le pointeur Dimitre – SteveC

Répondre

1

La réponse à l'aide local-name() est erroné car il permet des éléments indésirables à sélectionner, tels que:

  • ohmy: hasErrors
  • différents: hasErrors
  • : hasErrors
  • non souhaitée

Voici une solution correcte:

Dans le cas où il est impossible de lier un préfixe à l'espace de noms par défaut « http://www.aniteps.com/xml/schemas/awm/images4 », on peut utiliser la fonction standard XPath namespace-uri() de préciser que l'élément doit résider dans un espace de noms donné.

Thereforere, un exemple des expressions XPath qui sélectionnent la recherché deux types de nœuds est:

 
/*/*[namespace-uri() = 'http://www.aniteps.com/xml/schemas/awm/images4' 
    and 
    name() = 'HasErrors' 
    ] 

et l'expression:

 
/*/*[namespace-uri() = 'http://www.aniteps.com/xml/schemas/awm/images4' 
    and 
    name() = 'NumberOfErrors' 
    ] 
0

Si vos éléments ne sont pas vous répéter pourrait promouvoir à partir du schéma de réponse en tant que champs distincts. Ensuite, vous n'avez pas à vous soucier du codage. Il suffit d'utiliser:

x = YourMessageName.HasErrors; 

S'il est une référence web/WCF, vous pouvez promouvoir les valeurs de la reference.xsd (ou xyz.xsd avec "Assistant service WCF Consume"). Sachez juste que si vous mettez à jour la référence, ils vont "disparaître".

+0

Malheureusement, Reference.xsd n'est pas généré pour le service web que j'utilise ... Je crois que c'est parce qu'il ne retourne que des types simples, dans ce cas une chaîne – SteveC

Questions connexes