Откуда вы взяли этот XML?Он отформатирован способом, не поддерживаемым DataSet
.При вложении таблиц вы должны определить родительско-дочерние отношения между таблицами и установить для свойства Nested
дочерней таблицы значение true
.В вашем XML DataSet
не знает, к какому родительскому элементу принадлежит новая дочерняя строка, поэтому он добавляет его в конец.
В MSDN вы можете прочитать о Вложении DataRelations .
Сказав это, ваш XML на самом деле не имеет родительских и дочерних таблиц.Он имеет METADATA
и ROWDATA
.Как я уже сказал, этот формат не поддерживается DataSet
, вам придется переместить ваши метаданные в Schema
(XSD).В MSDN вы можете прочитать о Извлечение реляционной структуры DataSet из XML-схемы .
Вот пример того, как вы представляете свои данные с помощью XSD и XML:
using System;
using System.Data;
using System.IO;
using System.Xml;
public class Program
{
public static void Main()
{
string xml = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<MyDataSet>
<Companies>
<CompanyID>CC</CompanyID>
<Description>Contoso</Description>
</Companies>
</MyDataSet>
";
string xsd = @"<?xml version=""1.0"" encoding=""utf-8""?>
<xs:schema id=""SomeID""
xmlns=""""
xmlns:xs=""http://www.w3.org/2001/XMLSchema""
xmlns:msdata=""urn:schemas-microsoft-com:xml-msdata"">
<xs:element name=""MyDataSet"" msdata:IsDataSet=""true"">
<xs:complexType>
<xs:choice minOccurs=""0"" maxOccurs=""unbounded"">
<xs:element name=""Companies"">
<xs:complexType >
<xs:sequence>
<xs:element name=""CompanyID"" type=""xs:string"" minOccurs=""0"" />
<xs:element name=""Description"" type=""xs:string"" minOccurs=""0"" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
";
DataSet dataSet = new DataSet();
StringReader sr = new StringReader(xsd);
dataSet.ReadXmlSchema(sr);
sr = new StringReader(xml);
dataSet.ReadXml(sr, XmlReadMode.InferTypedSchema);
var rowTable = dataSet.Tables["Companies"];
var newRow = rowTable.NewRow();
newRow["CompanyID"] = "APPL";
newRow["Description"] = "Apple";
rowTable.Rows.Add(newRow);
Console.WriteLine(dataSet.GetXml());
}
}
В этом случае вам на самом деле не нужна схема, потому что у вас есть только одна таблица со всеми столбцами как string
.Поэтому, если вы удалите схему из приведенного выше кода и запустите ее снова, вы получите точно такие же результаты.Тем не менее, это дает вам представление о том, как определить структуру DataSet
с использованием схемы, чтобы вы могли добавлять более сложные таблицы со связями между ними.Для простых таблиц без связей вам не нужна схема.