2011-12-21 3 views
1

Profil: Biztalk 2009 Mise à jour 4 sur Windows 2008 Server SP2 (plate-forme de développement) Salut Lorsque vous utilisez XPath pour carte ma sortie en utilisant un Construct de message et une affectation de message avec le code suivant:Biztalk Obtenir erreur « NullPartException » lorsque vous utilisez XPath

sXPath = System.String.Format("/*[local-name()='ProcessSalesOrder' and namespace-uri()='http://www.TestSchemas.net/TestSchemas_V2_2/schemas']/*[local-name()='header' and namespace-uri()='http://www.TestSchemas.net/TestSchemas_V2_2/schemas']/*[local-name()='detail' and namespace-uri()='http://www.TestSchemas.net/TestSchemas_V2_2/schemas' and position()={0}]", nLoopCount); 
    System.Diagnostics.Debug.WriteLine(sXPath); 
    SingleInput = xpath(Input, sXPath); 

Je reçois une exception dans l'Observateur d'événements; J'ai une simple orchestration avec un port de réception, un port d'envoi en utilisant deux schémas. J'obtiens le nombre d'enregistrements du "détail" non borné dans une variable appelée nRecordCount et j'utilise un compteur de boucle dans le MessageLoop pour incrémenter ce placé à la fin dans un objet Expression avec nLoopCount = nLoopCount + 1; comme expression.

Orchestration

La structure de détail du 2ème schéma (Nom: SalesOrderDetail_V2_2.xsd) est le même que le 1er (Nom: SalesOrderRequest_V2_2.xsd), mais toutes les balises d'en-tête supprimés.

enter image description here

et le SalesOrderRequest_V2_2.xsd ci-dessous

enter image description here

Il semble comme une cheville carrée tente d'être mis en correspondance avec un trou rond. J'ai essayé de déboguer ceci mais échoue au code suivant dans le file0.cs au point montré ci-dessous;

enter image description here

Je ne peux pas trouver quelque chose d'utile dans le débogage Orchestration soit. Quelqu'un peut-il faire la lumière sur ce qui me manque peut-être quand j'utilise Xpath?

Le projet complet a été compressé et est disponible en téléchargement à l'adresse suivante

https://skydrive.live.com/redir.aspx?cid=533fd5a521c8c878&resid=533FD5A521C8C878!1848&parid=533FD5A521C8C878!119&authkey=!AE4gYqCoqmZd8xs

S'il vous plaît voir ce lien pour une solution possible. J'ai réussi à obtenir une solution réalisable si je modifie le fichier Structure de schéma (XSD).

Voici le lien: xpath - How to get Method B to work?

+0

Salut Filburt, La réalité est que le projet et la structure ci-dessus fonctionne bien avec une simple définition de schéma XSD avec seulement cinq éléments sous le nœud de détail sans autres éléments d'en-tête. Si j'augmente la complexité des schémas XSD comme indiqué dans les captures d'écran avec de nombreux nœuds et éléments dans le nœud d'en-tête ainsi que dans le nœud de détail, alors j'obtiens la situation où je reçois l'erreur d'exception. Autant que je peux voir les deux schémas avec le noeud de détail sont identiques. – Chrisk

+0

Dans le débogage, je peux voir la variable nRecordCount remplie avec le nombre correct d'éléments de détail dans l'expression GetRecordCount. Il entre dans le MessageLoop mais échoue au point où "SingleInput = xpath (Input, sXPath);" l'expression est exécutée. le message SingleInput est basé sur le schéma SalesOrderDetail et sXPath est le résultat de l'extraction de l'expression "System.String.Format ("/* [nom-local() = 'ProcessSalesOrder' et espace de noms ....... " – Chrisk

+0

Je crois qu'il y a une incompatibilité entre l'utilisation de la fonction xpath que je ne peux pas résoudre en utilisant les schémas complexes de cette version de l'Orchestration que je possède.Il doit être simple mais je semble être aveugle sur celui-ci. – Chrisk

Répondre

0

J'ai eu récemment un scénario très similaire (la création d'un lot de messages à partir d'un seul message d'entrée) et a fini avec seulement une solution légèrement différente:

A l'intérieur du loop Je crée un simple message Counter, en assignant la valeur actuelle du compteur. Ensuite, à l'intérieur d'une forme Construct Message, j'ai une carte qui utilise le message Counter et le message source d'origine comme messages d'entrée et le schéma de message de lot comme sortie.

A l'intérieur de la carte, j'utilise une fonction de script "Call Xslt Template" qui reçoit la valeur du compteur du compteur comme un paramètre Xslt. Ce paramètre que j'utilise pour extraire le nœud source désiré avec fondamentalement le même XPath (c'est-à-dire position() = $ param) comme vous le faites.Je suis conscient que l'utilisation de Call Xslt Template peut ne pas être une option pour vous simplement en raison de l'énorme quantité de champs.

Je n'ai pas mon environnement de développement BizTalk prêt prêt mais l'extraction du nœud de séquence devrait également être possible en utilisant des fonctoids "simples" au lieu de Call Xslt Template.

Questions connexes