В загруженном XML-наборе данных отсутствует таблица - PullRequest
0 голосов
/ 29 сентября 2011

Когда я читаю 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;
}

Edit:

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

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

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

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

1 Ответ

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

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

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

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

...