Я подозреваю, что решение заключается в предоставлении схемы. DataSet.Merge
не знает, что делать с двумя наборами элементов с одинаковыми именами. Он пытается вывести схему, но здесь это не так хорошо работает.
Согласно этой теме в MSDN , это ограничение класса DataSet
:
Класс DataSet в .NET 2.0 (Visual Studio 2005) по-прежнему имеет ограничение не поддерживать разные вложенные таблицы с одинаковыми именами. Поэтому вам придется ввести преобразование XML для предварительной обработки XML (и схем) перед загрузкой их в DataSet.
Конечно, из-за формулировки кажется , как если бы более новая версия могла это исправить. К сожалению, это может быть не так, поскольку первоначальный ответ был опубликован еще в 2005 году.
Эта статья базы знаний , по-видимому, указывает на то, что это поведение "разработано", хотя и в несколько ином контексте.
Лучшее объяснение того, почему происходит такое поведение, также дано в этой теме :
Когда ADO читает XML в DataSet, он создает DataTables, чтобы содержать каждый тип элемента, с которым он сталкивается. Каждая таблица уникально идентифицируется по имени. Вы не можете иметь две разные таблицы с именем "PayList".
Кроме того, данная таблица может иметь любое количество родительских таблиц, но только одно из ее родительских отношений может быть вложенным - в противном случае данная запись будет записана в XML несколько раз, как дочерний элемент каждой из ее родительских строк. .
Чрезвычайно удобно, что метод ReadXml DataSet может вывести схему DataSet, когда он читает входные данные, но XML должен соответствовать определенным ограничениям, если он будет читабельным. XML у вас нет. Таким образом, у вас есть две альтернативы: вы можете изменить XML или написать собственный метод для заполнения DataSet.
Если бы это был я, я бы написал XSLT-преобразование, которое бы взяло входной XML и превратило элементы PayList в элементы MatrixPayList или NonMatrixPaylist. Затем я передаю его вывод в DataSet.
Использование XmlDocument
или XDocument
для чтения и манипулирования файлами XML - это еще один возможный обходной путь. Для примера см. Объединение двух XML-файлов LINQ