2010-01-26 15 views
1

J'ai une situation dans laquelle ma carte BizTalk n'extrait pas correctement les données d'entrée XML.BizTalk Mapper incorrectement XML d'analyse syntaxique

Le schéma d'entrée ressemble à ceci:

Séquence

A 

    B 

Tous les trois de ces nœuds du XSD ont 0 min, max sans bornes.

Alors, voici un fragment de fichier d'entrée échantillon:

<A>1</A> 
<B>hi</B> 
<A>2</A> 
<B>there</B> 

Maintenant, ma carte prend ces données et les appels stockés procs pour insérer des données dans une table. Je reçois "salut" pour le champ B pour A de 1 et A de 2. C'est incorrect.

J'ai tracé le problème sur la carte. Le XSLT généré fait un foreach sur A, puis attrape la valeur B mais attrape toujours le premier B.

Donc, quelqu'un a des conseils pour modifier le schéma d'entrée ou la carte pour que cela fonctionne correctement?

+0

Je sais que cette question est ancienne, mais votre schéma est rendu comme "A B". Pourriez-vous le réparer, s'il vous plaît? Ajoutez également votre solution (si vous en avez une). – 13ren

+0

De votre description, vous avez les éléments A et B, avec min/max {0, non borné}, et enveloppés dans un élément de séquence qui a aussi min/max {0, unbounded}. En guise de réponse, je pense que vous pourriez ajouter un functoid de boucle explicite pour chacune de ces 3 parties. Ou, si vous avez toujours des paires AB (comme dans votre exemple), vous pouvez définir A et B sur {1,1}, et seulement avoir une boucle sur l'externe (en supposant qu'ils viennent toujours par paires). – 13ren

Répondre

2

Si vous avez besoin du groupe A et articles B rencontres, vous pouvez changer le schéma est de créer un élément d'emballage, de sorte que votre schéma ressemblerait à ceci:

<xs:element name="wrapper"> 
    <xs:complextype> 
    <xs:sequence> 
     <xsl:element name="A" type="xs:string" minoccur="1" maxoccur="1"/> 
     <xsl:element name="B" type="xs:string" minoccur="1" maxoccur="1" /> 
    </xs:sequence> 
    </xs:complextype> 
</xs:element> 

Ensuite, on boucle pourrait à travers des éléments d'enveloppe et obtenir les éléments A et B. Mais je ne suis pas sûr si c'est ce que vous cherchez.

L'autre option consiste à utiliser les modèles d'appel XSLT. En utilisant A et l'itération courante de A, alors quand vous obtenez B, vous êtes en réalité B [i], où i est l'itération courante.

+0

Excellente suggestion. Je vais l'essayer. Je me demande simplement si j'ai besoin du 'wrapper' du tout. L'élément de séquence ne sert-il pas d'enveloppe? Dans BizTalk, je peux spécifier min 0, max unbounded à ce niveau, puis min 1 max 1 à A et B. Je lui ai donné un essai rapide et il a complètement changé la sortie de ma transformation. – Krip

+0

C'est une bonne suggestion en effet, et vous pourriez au moins le modifier ou accepter la réponse. Il y a déjà trop de gens sur SO qui prennent des réponses et courent. – xcut

+0

Ne vous inquiétez pas, je ne m'enfuirai pas. Je vais certainement donner crédit où le crédit est dû. J'essaye toujours de résoudre ceci dans le contexte de BizTalk et c'est le critère pour moi 'le modding vers le haut'. Je suis incapable d'ajouter un wrapper et de le faire correctement analyser le fichier d'entrée en utilisant le schéma révisé, et encore moins d'exécuter la carte pour faire la transformation par la suite. C'est parce que si j'ajoute un élément wrapper je dois indiquer quel "texte" je cherche, comment il est délimité, etc., alors pour le moment, alors que c'est une bonne idée, ça ne marche pas pour moi. -Krip – Krip