Как представить уровни XML в наборе данных с помощью DataTables в .NET - PullRequest
1 голос
/ 03 сентября 2011

Это может быть глупый вопрос, но мне нужно сделать следующее в .NET:

У меня есть такой XML-документ:

<I_WOs>
  <I_WO>
    <I_WO_HEADER><External_Source_Id>1</External_Source_Id></I_WO_HEADER>
    <I_WO_PART><Part_Number>1</Part_Number></I_WO_PART>
  </I_WO>
  <I_WO>
    <I_WO_HEADER><External_Source_Id>2</External_Source_Id></I_WO_HEADER>
    <I_WO_PART><Part_Number>2</Part_Number></I_WO_PART>
  </I_WO>
</I_WOs>

Теперь мне нужно программно построить это в .NET, используя набор данных и DataTables. Примечание: тег I_WO_HEADER и теги I_WO_PART содержат гораздо больше полей (столбцы в таблице данных). Я упростил это здесь.

Пока у меня есть это:

DataSet ds = new DataSet("I_WOs");

DataTable workorderTable = new DataTable("I_WO");
DataTable headerTable = new DataTable("I_WO_HEADER");
DataTable partTable = new DataTable("I_WO_PART");

ds.Tables.Add(workorderTable);
ds.Tables.Add(headerTable);
ds.Tables.Add(partTable);

Но часть, которую я не понимаю, состоит в том, как связать таблицы данных так, чтобы Заголовок и Часть были ПОД I_WO, а не родными элементами?

Если я выполняю ds.GetXml (), то это выглядит не так. Если я загружаю XML в набор данных, то вижу, что он содержит 3 таблицы, подобные тем, которые я определил выше.

Любая помощь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2011

Я нашел несколько ссылок, которые продвинули меня немного дальше: Преобразование DataSet в XML с вложенными элементами и http://msdn.microsoft.com/en-us/library/7sfkwf9s%28v=vs.71%29.aspx#Y400

Поэтому я настроил некоторые ключи для данных идентификатора следующим образом:

DataRelation headerPartRelation = workOrderDetailsDataSet.Relations.Add ("HeaderPart", workOrderDetailsDataSet.Tables [0] .Columns ["EXTERNAL_SOURCE_ID"], workOrderDetailsDataSet.NER_TAL_NER_TAL_TAL&COL_TOR) * 1 * * * * * * 9 * *9;headerPartRelation.Nested = true;headerPartRelation.RelationName = "HeaderPart";

    DataRelation headerLabourRelation = workOrderDetailsDataSet.Relations.Add("HeaderLabour", workOrderDetailsDataSet.Tables[0].Columns["EXTERNAL_SOURCE_ID"], workOrderDetailsDataSet.Tables[2].Columns["EXTERNAL_SOURCE_ID"]);
    headerLabourRelation.Nested = true;
    headerLabourRelation.RelationName = "HeaderLabour";

    DataRelation headerMiscRelation = workOrderDetailsDataSet.Relations.Add("HeaderMisc", workOrderDetailsDataSet.Tables[0].Columns["EXTERNAL_SOURCE_ID"], workOrderDetailsDataSet.Tables[3].Columns["EXTERNAL_SOURCE_ID"]);
    headerMiscRelation.Nested = true;
    headerMiscRelation.RelationName = "HeaderMisc";

Однако проблема по-прежнему заключается в том, как получить пустой тег I_WO.Я скопировал таблицу заголовков и переименовал ее в I_WO, импортировал все строки из нее и установил отношение данных.Это дало мне структуру, в которой я нуждался, НО тег I_WO теперь содержит повторяющиеся элементы заголовка!Я не уверен, как этого избежать.

Как указал Джон - мне нужно подумать, чего я здесь добиваюсь - мне нужен XML в этом формате, и у меня есть 4 таблицы данных с данными.

Другой вариант - вручную сериализовать его в XML вместо использования .GetXML.Затем я мог бы создать нужные мне теги и перебирать таблицы данных по мере необходимости.Я не уверен в лучшем способе сделать это ...

0 голосов
/ 03 сентября 2011

Обычно вы делаете это со связью таблиц, если у вас есть ограничения FK между таблицами, либо XML конструктор VS или ReadXML покажет / вернет правильно вложенную структуру.

Родни, точка из вашего фрагмента XML выше:что да, I_WO_HEADER и I_WO_PART находятся внутри узла I_WO, но поскольку узел I_WO не имеет своих собственных атрибутов, не было бы никакого способа создать такой FK для создания иерархии.

на самом делеиз того, что я вижу, таблица I_WO пуста и не может существовать, и только у двух других таблиц есть поля.

это из краткого обзора, вы можете попытаться смоделировать ваши данные в конструкторе DataSet в Visual Studio, чем изВ коде вы создаете экземпляр класса, добавляете некоторые данные, такие как значения выше, в столбцы и экспортируете на диск, вызывая WriteXML, чтобы вы видели, что именно вы получаете?

...