В загруженном наборе данных Xml отсутствует таблица

Когда я читаю файл xml в набор данных, если корневой узел имеет более одного дочернего тега, он не создает таблицу для корневого узла. Почему это? Есть ли способ заставить его сгенерировать корневую таблицу без изменения xml?

static void Main(string[] args) {
    var ds =Load(@"<root>
      <Stores>Lambton Quay</Stores>
      <Stores>Willis Street</Stores>
    </root>");
    var ds2 = Load(@"<root>
      <t>1</t>
      <Stores>Lambton Quay</Stores>
      <Stores>Willis Street</Stores>
    </root>");
    Console.WriteLine("ds table count: {0}", ds.Tables.Count); //1 <- expecting 2
    Console.WriteLine("ds2 table count: {0}", ds2.Tables.Count); //2
    Console.ReadKey();
}
static DataSet Load(string xml) {
    var xd = new XmlDocument();
    xd.LoadXml(xml);
    var ds = new DataSet();
    ds.ReadXml(new XmlNodeReader(xd));
    return ds;
}

Редактировать:

Чтобы быть ясным, я хочу знать, почему в DataSet ds нет таблицы root, а в ds2 она есть.

Кто-то принял решение:

  1. если существует только 1 узел с данным именем тега под данным родительским тегом, он становится столбцом в таблице, названным родительским тегом.
  2. если существует более одного такого узла, он становится таблицей сам по себе
  3. если все дочерние узлы появляются более одного раза, а родительский узел является корнем документа, родительская таблица не создается

В чем причина №3?


person Bill Barry    schedule 29.09.2011    source источник


Ответы (1)


В первом примере XML не создается «корневая» таблица в наборе данных, поскольку в таблице с таким именем не будет создано ни строк, ни столбцов.

Во втором примере попробуйте добавить второй элемент <t>. Вы по-прежнему получите две таблицы, но они будут называться «t» и «Stores» (вместо «root» и «Stores»). Еще один тест — добавить еще один другой элемент во второй пример (скажем, <r>1</r>). В этом случае у вас по-прежнему будут две таблицы «root» и «Stores», но теперь «корневая» таблица будет иметь 1 строку с 2 столбцами (столбец «r» и столбец «t»).

Когда синтаксический анализатор увидит два элемента с одинаковыми именами, он создаст таблицу для этого элемента, и каждый экземпляр элемента будет новой строкой в ​​таблице. Когда синтаксический анализатор увидит несколько отдельных элементов под узлом, он создаст таблицу, используя имя родительского узла в качестве имени таблицы, и каждый отдельный элемент под родительским узлом будет столбцом в таблице.

person pmartin    schedule 29.09.2011
comment
Будет создан столбец идентификатора. Корневой узел содержит информацию о том, что хранилища связаны друг с другом на одном уровне. Я понимаю, что это так работает, я хочу понять, почему это так работает. - person Bill Barry; 30.09.2011
comment
Причина, по которой это работает, заключается в том, что дизайн соответствует большинству вариантов использования для сериализации XML в набор данных. Это не значит, что способ, которым вы хотите, чтобы он работал, недействителен — это просто не норма. Если вам действительно нужно, чтобы он работал определенным образом, вы всегда можете использовать свои собственные методы сериализации. - person pmartin; 30.09.2011