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
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
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
So, to sum up, I only have three explanations as to why it works for me and not for
the fellow with the issue:
- He is using a BizTalk version that is not BizTalk 2006 R2
- He hasn’t tried deploying it, and is relying on the map tester
- 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