Tuesday, 30 September 2008

Hi all

Today i read an email from a guy who had a problem with optional elements in an input giving problems in a positional flat file output. The issue being, of course, that if an element in the input of a map is optional, it might be missing. If the element is missing, it will not be created in the destination of a map, and therefore, the flat file assembler will complain because it needs the element to create the correct positional structure.

I seem to have it working, and will here walk through my solution to explain it.

First of all, I have a Schema for the XML input:

All elements are 1..1 except Element2, which has minOccurs=0.

Secondly, I have a schema for the flat file output:

All elements are mandatory. The record delimiter is 0x0d 0x0a and the two subrecords to the root are positional records.

The map is pretty straight forward:

Just plain connections between the elements.

For testing purposes, I have two test instances, that validate against the input schema. They are exactly the same, except one doesn't have the "Element2"-element in it.

If I try to test the map with the input that has the "Element2"-element, and turn on validation of both input and output, and let the output be "Native", then it will work. If, however, I test the map inside Visual Studio .NET with the example that does not have the Element2 element, it will fail. It will report that:

Output validation error: The element 'FirstElements' has incomplete content. List of possible elements expected: 'Element6'.

So basically, the map does not create the Element6 element in the destination schema, and since the Element6 element is required, it fails validation.

BUT, here comes the surprise; It works if it is deployed. So basically, there must be some inconstency between how the map tester in VS.NET works and how the stuff works when running.

 

I tried changing the schemas to include an element inside the first record as the last element, such that the input has a "SomeElements" record with three elements inside it, of which only the second is optional. Likewise I added a new element in the output schema and updated the map. You can see all three here:

 

Still, I only get errors when testing inside Visual Studio .NET and not when things are deployed and running... Which actually bugs me a bit, but that is a whole other story.

So, to sum up, I only have three explanations as to why it works for me and not for the fellow with the issue:

  1. He is using a BizTalk version that is not BizTalk 2006 R2
  2. He hasn't tried deploying it, and is relying on the map tester
  3. He has some bogus values for the two properties I will mention below

At the end of this post, let me just quickly mention to properties that are available for flat file schemas:

The "Generate Empty Nodes" and "Suppress Empty Nodes" properties might be helpful. They are defined here: http://msdn.microsoft.com/en-us/library/aa559329.aspx

Hope this helps someone.

You can find my project here: FlatFileEmptyElements.zip (27.55 KB)

--
eliasen

Tuesday, 30 September 2008 01:01:20 (Romance Daylight Time, UTC+02:00)  #    Comments [3]  | 
Friday, 18 December 2009 06:37:26 (Romance Standard Time, UTC+01:00)
I am trying to fix exactly opposite problem right now. if my source schema has an empty value then out put (flat file) schema is generating empty node (ex: <val4></val4>). Then after passing through pipeline instead of the delimiter I expect to see, its being replaced by crlf.

ex: if the empty node is val4 then output is as follows.

val1,val2,val3,
val5,val6 etc....

as you notice delimiter for val4 is missing and crlf is being added. if empty Val4 doesnt exist then everything is fine. Any solution?
Saturday, 19 December 2009 19:24:14 (Romance Standard Time, UTC+01:00)
Hi

If you get an input with an element thas has an empty input, then the mapper will create the destination element. This is by design.

I am not sure exactly what your issue is. I cannot see from your example if you were expecting val4 to be after val3 in the first line or before val5 in the second line.

If you could provide a test instance of some XML and the desired output, that would help.

Thanks.
Wednesday, 14 July 2010 18:28:48 (Romance Daylight Time, UTC+02:00)
Hi all

As a follow up, take a look at http://blog.eliasen.dk/2009/10/25/TestingAMapWhenUsingTheFixedPropertyOnAnElementInYourSchema.aspx where I describe that the error message may actually be bogus. Even though the error message states that the output is invalid, the actual error could be that the input is invalid instead.

so be careful out there.

--
eliasen
All comments require the approval of the site owner before being displayed.
OpenID
Please login with either your OpenID above, or your details below.
Name
E-mail
Home page

Comment (Some html is allowed: a@href@title, b, blockquote@cite, em, i, strike, strong, sub, sup, u) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Enter the code shown (prevents robots):

Live Comment Preview

Theme design by Jelle Druyts