public void WriteXmlModeSchema()
{
// This is the MS output of WriteXmlSchema().
string xml = @"<Example>
<xs:schema id=""Example"" xmlns="""" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
" +
@" <xs:element name=""Example"" msdata:IsDataSet=""true"" msdata:UseCurrentLocale=""true"">"
+ @"
<xs:complexType>
<xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
<xs:element name=""Dimension"">
<xs:complexType>
<xs:sequence>
<xs:element name=""Number"" type=""xs:int"" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=""Element"">
<xs:complexType>
<xs:sequence>
<xs:element name=""Dimension"" type=""xs:int"" />
<xs:element name=""Number"" type=""xs:int"" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name=""PK_Dimension"" msdata:PrimaryKey=""true"">
<xs:selector xpath="".//Dimension"" />
<xs:field xpath=""Number"" />
</xs:unique>
<xs:unique name=""PK_Element"" msdata:PrimaryKey=""true"">
<xs:selector xpath="".//Element"" />
<xs:field xpath=""Dimension"" />
<xs:field xpath=""Number"" />
</xs:unique>
<xs:keyref name=""FK_Element_To_Dimension"" refer=""PK_Dimension"">
<xs:selector xpath="".//Element"" />
<xs:field xpath=""Dimension"" />
</xs:keyref>
</xs:element>
</xs:schema>
<Dimension>
<Number>0</Number>
</Dimension>
<Dimension>
<Number>1</Number>
</Dimension>
<Element>
<Dimension>0</Dimension>
<Number>0</Number>
</Element>
<Element>
<Dimension>0</Dimension>
<Number>1</Number>
</Element>
<Element>
<Dimension>0</Dimension>
<Number>2</Number>
</Element>
<Element>
<Dimension>0</Dimension>
<Number>3</Number>
</Element>
<Element>
<Dimension>1</Dimension>
<Number>0</Number>
</Element>
<Element>
<Dimension>1</Dimension>
<Number>1</Number>
</Element>
</Example>";
DataSet ds = new DataSet("Example");
// Dimension DataTable
DataTable dt1 = new DataTable("Dimension");
ds.Tables.Add(dt1);
dt1.Columns.Add(new DataColumn("Number", typeof(int)));
dt1.Columns["Number"].AllowDBNull = false;
dt1.Constraints.Add("PK_Dimension", dt1.Columns["Number"], true);
// Element DataTable
DataTable dt2 = new DataTable("Element");
ds.Tables.Add(dt2);
dt2.Columns.Add(new DataColumn("Dimension", typeof(int)));
dt2.Columns["Dimension"].AllowDBNull = false;
dt2.Columns.Add(new DataColumn("Number", typeof(int)));
dt2.Columns["Number"].AllowDBNull = false;
dt2.Constraints.Add("PK_Element", new DataColumn[] {
dt2.Columns ["Dimension"],
dt2.Columns ["Number"] },
true);
// Add DataRelations
ds.Relations.Add("FK_Element_To_Dimension",
dt1.Columns["Number"],
dt2.Columns["Dimension"], true);
// Add 2 Dimensions
for (int i = 0; i < 2; i++)
{
DataRow newRow = dt1.NewRow();
newRow["Number"] = i;
dt1.Rows.Add(newRow);
}
// Dimension 0 => 4 Elements
for (int i = 0; i < 4; i++)
{
DataRow newRow = dt2.NewRow();
newRow["Dimension"] = 0;
newRow["Number"] = i;
dt2.Rows.Add(newRow);
}
// Dimension 1 => 2 Elements
for (int i = 0; i < 2; i++)
{
DataRow newRow = dt2.NewRow();
newRow["Dimension"] = 1;
newRow["Number"] = i;
dt2.Rows.Add(newRow);
}
ds.AcceptChanges();
StringWriter sw = new StringWriter();
ds.WriteXml(sw, XmlWriteMode.WriteSchema);
string result = sw.ToString();
Assert.Equal(result.Replace("\r\n", "\n"), xml.Replace("\r\n", "\n"));
}