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:
- 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 (27.55 KB)