Howto use BizTalk TestableReceivePipeline when having a schema which has an imported schema - testing

Under Microsoft BizTalk 2009, we want to test the ReceivePipeline(which has a Flat file disassembler) with the built-in TestableReceivePipeline class.
It works fine if we use one single Schema, but it throws an error (System.Xml.Schema.XmlSchemaException: The 'ABC' element is not declared.) when we try to use a schema(Schema1) which has an imported schema(Schema2) inside.
Why I'm getting this error?
code for testing pipeline:
StringCollection documents = new StringCollection();
documents.Add(#"c:\Test.dat");
StringCollection parts = new StringCollection();
Dictionary<string, string> schemas = new Dictionary<string, string>();
schemas.Add("MyCompany.Schema2", #"C:\Schema2.xsd");
schemas.Add("MyCompany.Schema1", #"C:\Schema1.xsd");
Microsoft.BizTalk.TestTools.Pipeline.TestableReceivePipeline pipeline = new MyReceivePipeline();
pipeline.TestPipeline(documents, parts, schemas);
Schema1.xsd source:
<xs:import schemaLocation=".\Schema2.xsd" namespace="http://MyCompany.Schema2" />
<xs:element name="Schema1">
<xs:complexType>
<xs:sequence>
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element name="ClientRef" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="1" wrap_char_type="default" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element ref="ns1:Data" />
<xs:element name="Tail">
<xs:complexType>
<xs:sequence>
<xs:element name="RecordCount" type="xs:int">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="3" wrap_char_type="default" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
Schema2.xsd source:
<xs:element name="Data">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type="xs:string" nillable="true">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" wrap_char_type="default" sequence_number="2" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="Surname" type="xs:string" nillable="true">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" sequence_number="3" wrap_char_type="default" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

AFAIK this is currently not supported in BizTalk 2009.

Related

Replace values in XML string with less than descriptive path

I have a very large xml field inside of a SQL Database that I have to edit regularly. I wrote the following Query to change that code which was easy following the xml path to get to what needed changed.
However I found more things further down in SQL that needs altered and I can not figure out the xml path to edit to make that change.
I've been utilizing the following Query to change just the username
DECLARE #config_xml2 xml
select #config_xml2 = configuration_xml from tblDatafeed where datafeed_name = 'DatafeedName' update tbldatafeed
set configuration_xml.modify('replace value of (//*:NetworkCredentialWrapper/#UserName)[1] with sql:variable("#LOGIN")') where datafeed_name ='DataFeedName'
Which is used to change the Username in the following:
<Tokens>
<Token name="DataFileDirectoryName" />
<Token name="DataFileName" />
<Token name="DataFileExtension" />
<Token name="LastRunTime" />
<Token name="LastFileProcessed" />
</Tokens>
<Transporter>
<transporters:WebServiceTransportActivity xmlns:transporters="clr-namespace:ArcherTech.DataFeed.Activities.Transporters;assembly=ArcherTech.DataFeed" xmlns:out="clr-namespace:ArcherTech.DataFeed;assembly=ArcherTech.DataFeed" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:compModel="clr-namespace:ArcherTech.DataFeed.ComponentModel;assembly=ArcherTech.DataFeed" xmlns:channel="clr-namespace:ArcherTech.DataFeed.Engine.Channel;assembly=ArcherTech.DataFeed" xmlns:engine="clr-namespace:ArcherTech.DataFeed.Engine;assembly=ArcherTech.DataFeed" xmlns:kernel="clr-namespace:ArcherTech.Kernel.Channel;assembly=ArcherTech.Kernel" xmlns="clr-namespace:ArcherTech.DataFeed;assembly=ArcherTech.DataFeed" xmlns:schema="clr-namespace:System.Xml.Schema;assembly=System.Xml" xmlns:xmlLinq="clr-namespace:System.Xml.Linq;assembly=System.Xml" xmlns:domain="clr-namespace:ArcherTech.Common.Domain;assembly=ArcherTech.Common" xmlns:s="clr-namespace:System;assembly=mscorlib" x:Key="transportActivity" SearchType="ReportId" Uri="Type URL Here" RecordsPerFile="100" ReportID="" UseWindowsAuth="false" IsWindowsAuthSpecific="false" WindowsAuthUserName="" WindowsAuthPassword="" WindowsAuthDomain="" ProxyName="" ProxyPort="" ProxyUsername="" ProxyPassword="" ProxyDomain="" IsProxyActive="False" ProxyOption="None" InstanceName="Type Instance Name Here" TempFileOnSuccessAction="DoNothing" TempFileOnSuccessRenameString="" TempFileOnErrorAction="DoNothing" TempFileOnErrorRenameString="" Transform="{engine:DataFeedBinding Path=Transform}" SessionContext="{engine:DataFeedBinding Path=Session}">
<transporters:ArcherWebServiceTransportActivity.Credentials>
<NetworkCredentialWrapper UserName="" />
</transporters:ArcherWebServiceTransportActivity.Credentials>
</transporters:ArcherWebServiceTransportActivity>
</Transporter>
<Iterator>
<XmlIterator>
But now I need to alter a string that a lot more complex and I am not sure my xml location is right. I have tried using //*NewSourceName1/#Calculation but it doesnt seem work:
Line of code Here I am trying to edit:
<xs:element name="NewSourceName1" type="xs:string" nillable="true" c:Name="Dashboard_Instance_Name" c:Calculation="=STATIC(&quot;MYSTRINGOFTEXTHERE&quot;)" dfm:SimpleFieldType="StaticText" />
Full xml it falls under
<Action>
<DataTransfer TargetType="Application" TargetLevel="20595ffc-afd5-4d34-babb-c8fa67c610ee" DisableValidation="true" PreValidate="false" InsertRecords="true" UpdateRecords="false" SyncAction="None" SyncFlagField="00000000-0000-0000-0000-000000000000" SyncFlagValue="00000000-0000-0000-0000-000000000000">
<Source>
<Schema><Schemas>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.archer-tech.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dfm="http://schemas.archer-tech.com/2009/xaml/datafeed" xmlns:c="http://archertech.com/ChannelFramework/Extensions" dfm:ComplexFieldType="None">
<xs:element name="ArcherRecords" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:element name="ArcherRecord" nillable="true" c:Name="ArcherRecord" dfm:ComplexFieldType="None" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" nillable="true" c:Name="Name" />
<xs:element name="Container_Type" nillable="true" c:Name="Container_Type">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" nillable="true" c:Name="Item" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Path" type="xs:string" nillable="true" c:Name="Path" />
<xs:element name="Abbreviation_Unique_Key" type="xs:string" nillable="true" c:Name="Abbreviation_Unique_Key" />
<xs:element name="Container_Owner" nillable="true" c:Name="Container_Owner">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" nillable="true" c:Name="Item" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Send_Upstream" nillable="true" c:Name="Send_Upstream">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" nillable="true" c:Name="Item" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="NewSourceName" type="xs:string" nillable="true" c:Name="Iteration" c:Calculation="=IF(AND(HOUR(NOW())&gt;=0,HOUR(NOW())&lt;8), &quot;ONE&quot;,&#xA; IF(AND(HOUR(NOW())&gt;=8,HOUR(NOW())&lt;16), &quot;TWO&quot;, &quot;THREE&quot;))" dfm:SimpleFieldType="CalculatedField" />
<xs:element name="NewSourceName1" type="xs:string" nillable="true" c:Name="Dashboard_Instance_Name" c:Calculation="=STATIC(&quot;MyTextHere&quot;)" dfm:SimpleFieldType="StaticText" />
<xs:element name="NewSourceName2" type="xs:string" nillable="true" c:Name="Date_Created" c:Calculation="=DATEFORMAT(TODAY(), &quot;MM/dd/yyyy&quot;)" dfm:SimpleFieldType="CalculatedField" />
<xs:element name="NewSourceName3" type="xs:string" nillable="true" c:Name="Created_By" c:Calculation="=STATIC(&quot;Local Dashboard&quot;)" dfm:SimpleFieldType="StaticText" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</Schemas></Schema>
</Source>
Hopeful out come (Look for MYSTRINGOFTEXTHERE or if I could just edit all of =STATIC("MYSTRINGOFTEXTHERE")):
<xs:element name="NewSourceName1" type="xs:string" nillable="true" c:Name="Dashboard_Instance_Name" c:Calculation="=STATIC(&quot;MYSTRINGOFTEXTHERE&quot;)" dfm:SimpleFieldType="StaticText" />
What I tried that didn't work
DECLARE #config_xml2 xml
select #config_xml2 = configuration_xml from tblDatafeed where datafeed_name = 'DatafeedName' update tbldatafeed
set configuration_xml.modify('replace value of (//*:NewSourceName1/#Calculation)[1] with sql:variable("#CoolVariableName")') where datafeed_name ='DataFeedName'
Any help would be greatly appreciated.
The XPath expression was completely off, so I adjusted it.
In XML, there are only five built-in character entities: <, >, &, " and &apos; for <, >, &, " and ' respectively. I replaced them with their literals. Please try the following.
SQL
DECLARE #tbl TABLE (id int IDENTITY PRIMARY KEY, configuration_xml XML);
INSERT INTO #tbl (configuration_xml)
VALUES
(N'<Action>
<DataTransfer TargetType="Application" TargetLevel="20595ffc-afd5-4d34-babb-c8fa67c610ee" DisableValidation="true" PreValidate="false" InsertRecords="true" UpdateRecords="false" SyncAction="None" SyncFlagField="00000000-0000-0000-0000-000000000000" SyncFlagValue="00000000-0000-0000-0000-000000000000">
<Source>
<Schema>
<Schemas>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.archer-tech.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:dfm="http://schemas.archer-tech.com/2009/xaml/datafeed" xmlns:c="http://archertech.com/ChannelFramework/Extensions" dfm:ComplexFieldType="None">
<xs:element name="ArcherRecords" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:element name="ArcherRecord" nillable="true" c:Name="ArcherRecord" dfm:ComplexFieldType="None" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" nillable="true" c:Name="Name" />
<xs:element name="Container_Type" nillable="true" c:Name="Container_Type">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" nillable="true" c:Name="Item" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Path" type="xs:string" nillable="true" c:Name="Path" />
<xs:element name="Abbreviation_Unique_Key" type="xs:string" nillable="true" c:Name="Abbreviation_Unique_Key" />
<xs:element name="Container_Owner" nillable="true" c:Name="Container_Owner">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" nillable="true" c:Name="Item" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Send_Upstream" nillable="true" c:Name="Send_Upstream">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" nillable="true" c:Name="Item" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="NewSourceName" type="xs:string" nillable="true" c:Name="Iteration" c:Calculation="=IF(AND(HOUR(NOW())&gt;=0,HOUR(NOW())&lt;8), &quot;ONE&quot;,&#xA; IF(AND(HOUR(NOW())&gt;=8,HOUR(NOW())&lt;16), &quot;TWO&quot;, &quot;THREE&quot;))" dfm:SimpleFieldType="CalculatedField" />
<xs:element name="NewSourceName1" type="xs:string" nillable="true" c:Name="Dashboard_Instance_Name" c:Calculation="=STATIC(&quot;MyTextHere&quot;)" dfm:SimpleFieldType="StaticText" />
<xs:element name="NewSourceName2" type="xs:string" nillable="true" c:Name="Date_Created" c:Calculation="=DATEFORMAT(TODAY(), &quot;MM/dd/yyyy&quot;)" dfm:SimpleFieldType="CalculatedField" />
<xs:element name="NewSourceName3" type="xs:string" nillable="true" c:Name="Created_By" c:Calculation="=STATIC(&quot;Local Dashboard&quot;)" dfm:SimpleFieldType="StaticText" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</Schemas>
</Schema>
</Source>
</DataTransfer>
</Action>');
DECLARE #CoolVariableName varchar(30) = 'Whatever Value';
UPDATE #tbl
SET configuration_xml.modify('replace value of (//xs:element[#name="NewSourceName1"]/#*:Calculation)[1] with sql:variable("#CoolVariableName")');
SELECT * FROM #tbl;

BizTalk FlatFile Schema multiple repeating records

I have a flat file and I need to create a schema so I can convert that flat file into XML and bring it to BizTalk.
I have used flat file schema wizard to create a schema but it is not working. I've modified it manually still not working. I will explain what is not working.
Flat File structure:
File header
Batch header
Detail (repeating records)
Address (repeating records)
Trailer
END
After creating the schema I'm trying to validate it and I'm getting error at this point.
Detail and Address are the body and they are repeatable.
My issue is that after it reads the line "DET" it is suppose to read the "ADD". However it is looking for "DET" again.
Error description:
error BEC2004: Unexpected data found while looking for:
'DET'
The current definition being parsed is RefundsRoot. The stream offset where the error occured is 799. The line number where the error occured is 4. The column where the error occured is 0.
Here is the sample
FDR06281339CREDIT REFUND CHECKS AC
HDR9008100000000000100006428
DET900810000000636992103500048763699210350004876369921035000487STMT, TEST 5 01TEST 5 STMT 6902 PINE ST OMAHA NE68106-2855 0000000000+0000000000500000 00FINUT A +00000000000004900 FHSC999999 +0000000000500 EN 0099000000000 +0000000000000+000000000000000000+0000000000000+000000000000000000+0000000000000+0000000000000000000000000000+00009999999999999+00009999999999999+00000000000000000+00000000000000000+999999999999999+99999999999999900000000000+9999999999999990000000000000009900
ADDF 6902 PINE ST OMAHA NE 68106-2855USA
TRL90081000000000001000000020000000000000642800000000000004900000000000000000000
END000000100000000200000000000000000000004900000000000000000000
Here is the schema (due to character limits I've only included related section)
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Fingerhut.BizTalk.Schemas.FSIn_Refunds" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://Fingerhut.BizTalk.Schemas.FSIn_Refunds" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo>
<schemaEditorExtension:schemaInfo namespaceAlias="b" extensionClass="Microsoft.BizTalk.FlatFileExtension.FlatFileExtension" standardName="Flat File" xmlns:schemaEditorExtension="http://schemas.microsoft.com/BizTalk/2003/SchemaEditorExtensions" />
<b:schemaInfo standard="Flat File" codepage="65001" default_pad_char="0x0A 0x0D" pad_char_type="hex" count_positions_by_byte="false" parser_optimization="speed" lookahead_depth="3" suppress_empty_nodes="false" generate_empty_nodes="true" allow_early_termination="true" early_terminate_optional_fields="false" allow_message_breakup_of_infix_root="true" compile_parse_tables="false" root_reference="RefundsRoot" />
</xs:appinfo>
</xs:annotation>
<xs:element name="RefundsRoot">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" sequence_number="1" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" child_delimiter_type="hex" child_delimiter="0x0D 0x0A" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:complexType name="Detail">
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="DETL-HDR" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="3" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-SYSTEM" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="4" sequence_number="2" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-PRIN-BANK" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="4" sequence_number="3" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-AGENT-BANK" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="4" sequence_number="4" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-ACCOUNT-NUMBER" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="16" sequence_number="5" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-PRMR-PI-ID" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="16" sequence_number="6" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-ENTR-ID" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="16" sequence_number="7" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-PI-NM" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="26" sequence_number="8" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-FILLER" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="2" sequence_number="9" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-PI-ROLE-CD" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="2" sequence_number="10" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-PRIMARY-NAME" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="26" sequence_number="11" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-SECONDARY-NAME" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="26" sequence_number="12" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-ADDRESS-LINE-1" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="26" sequence_number="13" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-ADDRESS-LINE-2" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="26" sequence_number="14" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-CITY" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="18" sequence_number="15" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-STATE" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="2" sequence_number="16" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-POST-CODE" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="10" sequence_number="17" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-REF-NUM" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="18" sequence_number="18" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-CHK-STARTING-NUM" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="5" sequence_number="19" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-NUMBER-OF-CKS" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="4" sequence_number="20" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-DUALITY-FLAG" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="1" sequence_number="21" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-CREDIT-LIMIT" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="14" sequence_number="22" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-NUMBER-OF-PLASTICS" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="3" sequence_number="23" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="DETL-CHECKING-ACCOUNT-NUM" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="17" sequence_number="24" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Address">
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="ADDR-EXPN-ADDR-RCRD-HEDR-ID" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="3" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-PRMR-CUST-ADDR-FRMT-CD" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="1" sequence_number="2" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-ATTN-LINE-TX" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="50" sequence_number="3" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-CMPN-NM" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="50" sequence_number="4" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-HOUS-NR" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="10" sequence_number="5" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-STRT-NM" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="40" sequence_number="6" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-CNTN-ADDR-LINE-1-TX" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="50" sequence_number="7" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-CNTN-ADDR-LINE-2-TX" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="50" sequence_number="8" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-CNTN-ADDR-LINE-3-TX" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="50" sequence_number="9" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-CNTN-ADDR-LINE-4-TX" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="50" sequence_number="10" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-PO-BOX-TX" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="10" sequence_number="11" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-CITY-NM" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="25" sequence_number="12" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-ST-CD" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="2" sequence_number="13" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-SBDV-TX" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="25" sequence_number="14" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-PSTL-CD" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="10" sequence_number="15" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-CTRY-CD" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="3" sequence_number="16" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="ADDR-FILLER" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo sequence_number="17" justification="left" pos_length="271" pos_offset="0" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
The following schema works (you of cause need to change my string elements to the correct positional record).
What you have to do is:
Add a record after the flat file wizard.
Put the record after your FDR element.
Add your repeating records DEC ADD to this new records as child elements.
Set the record to unbound
Set Child order Infix
Child delimiter type to Hex
Child delimiter to 0x0D 0x0A
This gives you the following schema:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://FlatFileSchema4" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://FlatFileSchema4" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo>
<schemaEditorExtension:schemaInfo namespaceAlias="b" extensionClass="Microsoft.BizTalk.FlatFileExtension.FlatFileExtension" standardName="Flat File" xmlns:schemaEditorExtension="http://schemas.microsoft.com/BizTalk/2003/SchemaEditorExtensions" />
<b:schemaInfo standard="Flat File" codepage="65001" default_pad_char=" " pad_char_type="char" count_positions_by_byte="false" parser_optimization="speed" lookahead_depth="3" suppress_empty_nodes="false" generate_empty_nodes="true" allow_early_termination="false" early_terminate_optional_fields="false" allow_message_breakup_of_infix_root="false" compile_parse_tables="false" root_reference="Root" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Root">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" child_delimiter_type="hex" child_delimiter="0xD 0xA" child_order="postfix" sequence_number="1" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="FDR">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="positional" tag_name="FDR" tag_offset="0" sequence_number="1" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="FDR" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="35" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="HDR">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="positional" tag_name="HDR" tag_offset="0" sequence_number="2" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="HDR" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="29" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element maxOccurs="unbounded" name="RR">
<xs:annotation>
<xs:appinfo>
<recordInfo structure="delimited" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" sequence_number="3" child_delimiter_type="hex" child_delimiter="0x0D 0x0A" child_order="infix" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="DET">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="positional" tag_name="DET" tag_offset="0" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="DET" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="482" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ADD">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="positional" tag_name="ADD" tag_offset="0" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" sequence_number="2" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="ADD" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="41" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="TRL">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="positional" tag_name="TRL" tag_offset="0" sequence_number="4" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="TRL" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="81" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="END">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="positional" tag_name="END" tag_offset="0" sequence_number="5" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element name="END" type="xs:string">
<xs:annotation>
<xs:appinfo>
<b:fieldInfo justification="left" pos_offset="0" pos_length="63" sequence_number="1" />
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
With test file:
FDR06281339CREDIT REFUND CHECKS AC
HDR9008100000000000100006428
DET900810000000636992103500048763699210350004876369921035000487STMT, TEST 5 01TEST 5 STMT 6902 PINE ST OMAHA NE68106-2855 0000000000+0000000000500000 00FINUT A +00000000000004900 FHSC999999 +0000000000500 EN 0099000000000 +0000000000000+000000000000000000+0000000000000+000000000000000000+0000000000000+0000000000000000000000000000+00009999999999999+00009999999999999+00000000000000000+00000000000000000+999999999999999+99999999999999900000000000+9999999999999990000000000000009900
ADDF 6902 PINE ST OMAHA NE 68106-2855USA
DET900810000000636992103500048763699210350004876369921035000487STMT, TEST 5 01TEST 5 STMT 6902 PINE ST OMAHA NE68106-2855 0000000000+0000000000500000 00FINUT A +00000000000004900 FHSC999999 +0000000000500 EN 0099000000000 +0000000000000+000000000000000000+0000000000000+000000000000000000+0000000000000+0000000000000000000000000000+00009999999999999+00009999999999999+00000000000000000+00000000000000000+999999999999999+99999999999999900000000000+9999999999999990000000000000009900
ADDF 6902 PINE ST OMAHA NE 68106-2855USA
TRL90081000000000001000000020000000000000642800000000000004900000000000000000000
END000000100000000200000000000000000000004900000000000000000000
And output:
<Root xmlns="http://FlatFileSchema4">
<FDR xmlns="">
<FDR>FDR06281339CREDIT REFUND CHECKS AC</FDR>
</FDR>
<HDR xmlns="">
<HDR>HDR9008100000000000100006428</HDR>
</HDR>
<RR xmlns="">
<DET>
<DET>DET900810000000636992103500048763699210350004876369921035000487STMT, TEST 5 01TEST 5 STMT 6902 PINE ST OMAHA NE68106-2855 0000000000+0000000000500000 00FINUT A +00000000000004900 FHSC999999 +0000000000500 EN 0099000000000 +0000000000000+000000000000000000+0000000000000+000000000000000000+0000000000000+0000000000000000000000000000+00009999999999999+00009999999999999+00000000000000000+00000000000000000+999999999999999+99999999999999900000000000+9999999999999990000000000000009900</DET>
</DET>
<ADD>
<ADD>ADDF 6902 PINE ST OMAHA NE 68106-2855USA</ADD>
</ADD>
</RR>
<RR xmlns="">
<DET>
<DET>DET900810000000636992103500048763699210350004876369921035000487STMT, TEST 5 01TEST 5 STMT 6902 PINE ST OMAHA NE68106-2855 0000000000+0000000000500000 00FINUT A +00000000000004900 FHSC999999 +0000000000500 EN 0099000000000 +0000000000000+000000000000000000+0000000000000+000000000000000000+0000000000000+0000000000000000000000000000+00009999999999999+00009999999999999+00000000000000000+00000000000000000+999999999999999+99999999999999900000000000+9999999999999990000000000000009900</DET>
</DET>
<ADD>
<ADD>ADDF 6902 PINE ST OMAHA NE 68106-2855USA</ADD>
</ADD>
</RR>
<TRL xmlns="">
<TRL>TRL90081000000000001000000020000000000000642800000000000004900000000000000000000</TRL>
</TRL>
<END xmlns="">
<END>END000000100000000200000000000000000000004900000000000000000000</END>
</END>
</Root>
I have updated the schema to also include the extra records that your testfile now have. And it works for me.

How to organize my code

I have an auto generated class file with many partial classes (auto generated from an xsd schema). I use VS2010 and VB.NET.
I want to create objects of all of the partial classes like this
Dim schema_obj As Schema
schema_obj = New Schema
schema_obj.Info = New Info
schema_obj.Info.Number = New Number
schema_obj.Info.Number.Value = 3
For all the properties in the different classes (like ex.
schema_obj.Info.Number.Value
schema_obj.Info.Birthday.Value
schema_obj.Info.Colour
I have to write
schema_obj.Info.Number = New Number
schema_obj.Info.Birthday = New Birtday
schema_obj.Info.Colourr = New Colour
I have one function that creates all of these objects and this way I fill the schema object with data.
What is the best way to organize my code? And what about dependency injection? Where should I put my function? In the business layer?
Thanks in advance
UPDATE:
Thanks for all comments and your complementary answer! I appreciate it very much!
I’m developing a part of and business application. The application is used for registration of persons data, invoicing, accounting, and so on. The part I’m developing is a reporting system to the authority via wcf services. In my part I will use VB.NET but the other parts of the system are developed in VB6. We use an SQL server and nearly all the business logic is located at the server side. Because I’m used to use VB6 its difficult to grasp all the OOP things I need to remember to write the code as it should be.
In my part of the application I get an xsd schema from the authority and auto generate my schema class file from the xsd file with xsd.exe. I see that it’s a much better solution that you suggest, but when I looked at my auto generated class file after reading your answer I see that every partial class has a MyBase = New line in the constructor. I can use this in a way, like you suggest? Sorry for not understanding this earlier! If I understand the behavior of MyBase correct, I can write
Dim Number = New Number
Number.value = 3
and the Number constructor will call the Info constructor an the Info constructor will call the Schema constructor.
And I can write
Dim PersonName = New PersonName
PersonName.Value = Bob
Dim PersonAdress = New PersonAdress
PersonAdress.Value = New York
Instead of
schema_obj.Info.Person.PersonName = New PersonName
schema_obj.Info.Person.PersonName.value = Bob
But still I have to create many objects in my function. How can I do this in a better way?
And in the end of my function I want to parse the schema object to a memory stream.
I do that like this:
Dim memorystream As New System.IO.MemoryStream
Dim ser As New XmlSerializer(GetType(Schema))
ser.Serialize(memorystream, Schema_obj)
But now I do not have a Schema_obj that holds the information, how can I parse the schema_obj (all the information) to a memorystream?
UPDATE 2
Sorry, now I understand (I think) and I have done as you said and I can write
Schema_obj = New Schema
Schema_obj.Info.Number.Value = 3
Schema_obj.Info.Person.PersonName = New PersonName
Schema_obj.Info.Person.PersonName.value = Bob
And I do not have to create the objects in my function. But instead of adding my own constructors the MyBase takes care of the job? And now I also can serialize my schema_obj.
But is it possible for you to say anything more about how I can solve the problem with Schema_obj.Info.Number.Value = 3
The project I doing is a fest step against vb.net and OOP for my business. I can use entity framework for my data layer, and I can have my business logic in a Business layer. My front end will be in vb6.
UPDATE 3
Now I’m back to being a little bit confused. I thought I got it but I do not… when I try to run my application I get the error: Object reference not set to an instance of an object. It seems like I have to write
Dim schema_obj As Schema
schema_obj = New Schema
schema_obj.Info = New Info
schema_obj.Info.Number = New Number
schema_obj.Info.Number.Value = 3
The MyBase did not do what I thought it did? Can you please explain some more? Thank you!
UPDATE 4
Thanks for your reply.
Take an XML Schema and have VB.NET classes generated from it.
Build objects and fill in some data (property values).
Serialize everything back to XML.
This is exactly what I do. But I thought I had to convert the xsd to a class, build objects and fill the objects with data and then serialize it back to xml. Why is it a better solution to go for what you suggest? I’m new to this so I appreciate your answers. Do you have an example of when it it a good solution to convert the xsd to objects, like I have done? The xsd I use will change once a year, is it easier to adapt my code to the changes in the way you suggest? The xsd schema is more complex than I showed in my example, I do not know if that have anything to say regarding what method I have to choose?
UPDATE 5:
I’m developing an application where I use wcf services . I use the web service the organization offer to:
1.Send an xml schema populated with data
2.Get a list of available web services
3.Get a specific xsd schema
What I have to do is:
1.Get a xsd schema form the authority and use this xsd to generate a xml populated with data
2.Call the webservice where I can specify a number for a specific xsd schema , and get the xsd schema in return. Then I can validate my xml schema against it before I send it to the authority
3.Use a web service where my xml string is in a string property of a method of the wcf service and I send the xml file to the authority
My xsd looks (almost) like this:
<?xml version="1.0" encoding="iso-8859-1"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:br="http://www.br.se/or" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--title='Tittle' lang='E'-->
<xs:element name="Schema">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some text</p>
</br:txt>
</xs:documentation>
<xs:documentation>
…………………………
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="Information"/>
<xs:element minOccurs="0" ref="Payer"/>
</xs:sequence>
<xs:attribute fixed="105" name="numberr" type="xs:integer" use="required"/>
<xs:attribute fixed="10360" name="externalnumberr" type="xs:integer" use="required"/>
<xs:attribute fixed="Title" name="title" type="xs:string" use="optional"/>
<xs:attribute fixed="4895" name="groupid" type="xs:positiveInteger" use="optional"/>
<xs:attribute name="id" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="761065">
<xs:annotation>
<xs:documentation>Text</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:anyAttribute/>
</xs:complexType>
</xs:element>
<xs:element name="Info">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some Text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="Task">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element ref="Year">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some Text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="Taskowner"/>
</xs:sequence>
<xs:attribute fixed="4877" name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="TaskSpesialTask">
<xs:annotation>
<xs:documentation>
<br:info br:type="some txt">1</br:info>
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="List1">
<xs:attribute fixed="212" name="schemaid" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="List2">
<xs:annotation>
<xs:documentation>
<br:info br:type="id">2</br:info>
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:length value="1"/>
<xs:enumeration value="1">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="2">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:element name="Year">
<xs:annotation>
<xs:documentation>
<br:info br:type="pl">2</br:info>
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="Format">
<xs:attribute fixed="692" name="schemaid" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="Format">
<xs:annotation>
<xs:documentation>
<br:info br:type="id">6</br:info>
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:gYear"/>
</xs:simpleType>
<xs:element name="TaskOwner">
<xs:annotation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="LEDE">
<p>Some Text</p>
</br:txt>
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="TaskoOwnerNumber">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="TaskOwnerName">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="TaskOwnerAdress
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="TaskOwnerPhone">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="TaskOwnerEmail">
<xs:annotation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute fixed="48" name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="TaskOwnerNumber">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="TextFormat">
<xs:attribute fixed="21" name="id" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="TextFormat">
<xs:annotation>
<xs:documentation>
<br:info br:type="id">1</br:info>
</xs:documentation>
<xs:documentation>
<br:txt br:lang="E" br:txttype="F">
<p>Wrong number</p>
</brreg:tekst>
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:length value="9"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="TaskOwner name">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="TextFormat">
<xs:attribute fixed="2" name="id" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="TaskOwner Adress">
<xs:annotation>
</xs:annotation>
</xs:element>
And so on for phone and email
<xs:element name="Payers">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="20000" minOccurs="0" ref="PayersInfo"/>
<xs:element minOccurs="0" ref="PaymentTotal">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="NumberOfPayers">
<xs:annotation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute fixed="410" name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="PayersInfo">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="PayerBirthNumber">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerNumber">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerBirthDay">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerName">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerAdress">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerPhone">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerEmail">
<xs:annotation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" ref="PayerSum">
<xs:annotation>
</xs:annotation>
</xs:element>
</xs:sequence>
<xs:attribute fixed="48" name="id" type="xs:positiveInteger" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="PayerBirthNumber">
<xs:annotation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="TextFormat">
<xs:attribute fixed="2305" name="id" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="TextFormat">
<xs:annotation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:length value="11"/>
</xs:restriction>
</xs:simpleType>
And som on for PayerNumber, PayerBirthDay, PAYerNAMe, PayerAdress, PayerPhone, PayerEmail…..
</xs:schema>
The elements in the xsd are structured as this:
Schema
Info
Year
TaskOwner
TaskOwnerName
TaskOwnerAdress
TaskOwnerPhone
TaskOwnerEmail
TaskOwnerNumber
Task
TaskSpecialTask
TaskOrdinaryTask
Payers
PaymentTotal
NumberOfPayers
PayersInfo (list of payers)
PayerBirtNumber
PayerBirthDay
PayerName
PayerAdress
PayerPhone
PayerEmail
(Pleas ignore if something is left out in the xsd - it is there just so I can explain my problem better)
My question is, how should I generate the xml based on the xsd? I want to do this for multiple xsd schemas. Isn't it the a good solution to deserialize the xsd (with xsd.exe) to a class, create object of that class and populate it with data, and then serialize the object back to xml? Or is it still better the way you suggest. I really want to learn and do it the best way, and not do it the easiest way for me.. I hope this makes it easier for you to give me an answer.
Thanks!

Can we add new attribute or change type of existing attribute to a "Referenced Element"?

In my XML schema I have an element being referenced tens of times by other elements but with different enumerated values for one of its attribute.
For now, instead of creating this element in global space and referencing it later, I am creating a new instance wherever it is needed. This approach has increased my schema size enormously because of repeated creation of almost same element many times. It also may have adverse effect on efficiency of the schema.
The only way that I see is to create element once and then reference it many times but my problem is: one of the attribute of this referenced element is required to have a different set of enumerations for each referencing element.
My question is:
Is it possible to to add an attribute to a "Referenced Element" in XML Schema?
Something like this:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.myDomain.com" xmlns="http://www.myDomain.com" elementFormDefault="qualified">
<xs:simpleType name="myValues1">
<xs:restriction base="xs:string">
<xs:enumeration value="value1" />
<xs:enumeration value="value2" />
</xs:restriction>
</xs:simpleType>
<xs:element name="myElement">
<xs:complexType mixed="true">
<xs:attribute name="attr1" type="xs:string" />
<xs:attribute name="attr2" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="MainElement1">
<xs:complexType>
<xs:sequence>
<xs:element ref="myElement">
<xs:complexType>
<xs:attribute name="myAtt" type="myValues1" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="mainAtt1" />
</xs:complexType>
</xs:element>
</xs:schema>
Or can we change type of an existing attribute of a "Referenced Element" in XML Schema?
something like this:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.myDomain.com" xmlns="http://www.myDomain.com" elementFormDefault="qualified">
<xs:simpleType name="myValues1">
<xs:restriction base="xs:string">
<xs:enumeration value="value1" />
<xs:enumeration value="value2" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="myValues2">
<xs:restriction base="xs:string">
<xs:enumeration value="value3" />
<xs:enumeration value="value4" />
</xs:restriction>
</xs:simpleType>
<xs:element name="myElement">
<xs:complexType mixed="true">
<xs:attribute name="attr1" type="xs:string" />
<xs:attribute name="attr2" type="xs:string" />
<xs:attribute name="myAtt" type="myValues1" />
</xs:complexType>
</xs:element>
<xs:element name="MainElement1">
<xs:complexType>
<xs:sequence>
<xs:element ref="myElement">
<xs:complexType>
<xs:attribute name="myAtt" type="myValues2" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="mainAtt1" />
</xs:complexType>
</xs:element>
</xs:schema>
You cannot override the content model of a referenced element. The point of the reference is that it points to exactly the same element every time.
If you really want the element to have different content, you are better off defining multiple global complex types and using them, rather than using an element reference:
<xs:complexType name="Type1" mixed="true">
<xs:attribute name="attr1" type="xs:string" />
<xs:attribute name="attr2" type="xs:string" />
<xs:attribute name="myAtt" type="myValues1" />
</xs:complexType>
<xs:complexType name="Type2" mixed="true">
<xs:complexContent>
<xs:extension base="Type1">
<xs:attribute name="myAtt2" type="myValues2" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MainElement1">
<xs:complexType>
<xs:sequence>
<xs:element name="myElement" type="Type1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
I would not worry too much about performance. The reference to the global types will be resolved only once at schema load time.

XML and Sql Server 2005

i have a problem that I want to resolve in a best possible way. The thing is that I made a schema that looks like this:
print("
<xs:complexType name="rentACarT">
<xs:sequence>
<xs:element name="poslovnice" type="poslovniceT" />
<xs:element name="korisnici" type="korisniciT" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="poslovniceT">
<xs:sequence>
<xs:element name="poslovnica" type="poslovnicaT" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="poslovnicaT">
<xs:sequence>
<xs:element name="naziv" type="xs:string" />
<xs:element name="adresa" type="adresaT" />
<xs:element name="grad" type="gradT" />
<xs:element name="vozila" type="vozilaT" />
<xs:element name="zaposlenici" type="zaposleniciT" />
<xs:element name="posudbe" type="posudbeT" />
</xs:sequence>
<xs:attribute name="id" type="xs:int" />
</xs:complexType>
<xs:complexType name="vozilaT">
<xs:sequence>
<xs:element name="vozilo" type="voziloT" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="zaposleniciT">
<xs:sequence>
<xs:element name="zaposlenik" type="zaposlenikT" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="korisniciT">
<xs:sequence>
<xs:element name="korisnik" type="korisnikT" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="posudbeT">
<xs:sequence>
<xs:element name="posudba" type="posudbaT" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="posudbaT">
<xs:sequence>
<xs:element name="idVozila" type="xs:int" />
<xs:element name="jmbgZaposlenika" type="jmbgT" />
<xs:element name="jmbgKorisnika" type="jmbgT" />
<xs:element name="datumPosudbe" type="xs:date" />
<xs:element name="ugovoreniDatumPovratka" type="xs:date" />
<xs:element name="stvarniDatumPovratka" type="xs:date" />
</xs:sequence>
<xs:attribute name="id" type="xs:integer" />
</xs:complexType>
<xs:complexType name="voziloT">
<xs:sequence>
<xs:element name="registracija" type="xs:string" />
<xs:element name="modelVozila" type="modelVozilaT" />
<xs:element name="godinaProizvodnje" type="godinaT" />
<xs:element name="cijenaPosudbePoDanu" type="xs:double" />
</xs:sequence>
<xs:attribute name="id" type="xs:int" />
</xs:complexType>
<xs:complexType name="zaposlenikT">
<xs:sequence>
<xs:element name="ime" type="xs:string" />
<xs:element name="prezime" type="xs:string" />
<xs:element name="spol" type="spolT" />
<xs:element name="datumZaposlenja" type="xs:date" />
<xs:element name="grad" type="xs:double" />
</xs:sequence>
<xs:attribute name="jmbg" type="jmbgT" />
</xs:complexType>
<xs:complexType name="korisnikT">
<xs:sequence>
<xs:element name="ime" type="xs:string" />
<xs:element name="prezime" type="xs:string" />
<xs:element name="spol" type="spolT" />
<xs:element name="adresa" type="adresaT" />
<xs:element name="grad" type="gradT" />
<xs:element name="status" type="statusKorisnikaT" />
</xs:sequence>
<xs:attribute name="jmbg" type="jmbgT" />
</xs:complexType>
<xs:complexType name="modelVozilaT">
<xs:sequence>
<xs:element name="tipVozila" type="tipVozilaT" />
<xs:element name="marka" type="xs:string" />
<xs:element name="model" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="tipVozilaT">
<xs:restriction base="xs:string">
<xs:enumeration value="auto" />
<xs:enumeration value="kombi" />
<xs:enumeration value="kamion" />
<xs:enumeration value="limuzina" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="godinaT">
<xs:restriction base="xs:int">
<xs:minInclusive value="1980" />
<xs:maxInclusive value="2050" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="jmbgT">
<xs:restriction base="xs:string">
<xs:pattern value="([0-9]){13}" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="spolT">
<xs:restriction base="xs:string">
<xs:enumeration value="m" />
<xs:enumeration value="f" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="statusKorisnikaT">
<xs:restriction base="xs:string">
<xs:enumeration value="stalni" />
<xs:enumeration value="novi" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="gradT">
<xs:sequence>
<xs:element name="postanskiBroj" type="xs:int" />
<xs:element name="naziv" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="adresaT">
<xs:sequence>
<xs:element name="ulica" type="xs:string" />
<xs:element name="kucniBroj" type="xs:int" />
</xs:sequence>
</xs:complexType>
");
Now, I don't want to put the entire xml document into one row. At least I think it is bad.
I would like to move "poslovnice"(contains multiple "poslovnica") in one table and "vozila" in other...
And is it better to hold each "poslovnica" in one row in table Poslovnica or have all elements "poslovnica" in one row?
And what about uniqueness since SQL Server doesn't support unique xml data type, I've seen that you can use triggers and functions, is there any other way?
Also, if I break the xml document, and have poslovnice in one table and their vozila in other, how to achieve to show that vozilo belongs to poslovnica, should I put id of poslovnica in each vozilo in xml or should I reference rows in SQL Server?
Or would you reccomend some other database?
Thank you very much, I am sorry if I wasn't clear enough :( !
Miroslav
well first you have to ask yourself why do you want it stored in XML in the db?
this seems like a perfect scenario to have tables Poslovnica, Vozilo and Zaposlenik and have intermediate tables that hold info on which employee rented what car where.
i don't see a reason to store this in xml at all.