VB.net XML to DataSet - связь между различными элементами DataTables - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в XML и пытаюсь научиться конвертировать XML в DataSet с помощью DataTables.(А потом сохраните его снова - без перебора файла).В моем XML есть 2 вида группировок, которые я назвал As и Bs.B являются подгруппой As и могут содержать ноль или более элементов B.Первая таблица - это As, третья - это B, а вторая, я полагаю, содержит информацию о том, какие B принадлежат какому, но это часть, которую я не понимаю.

Данные XML

 <?xml version="1.0" encoding="utf-8"?>
  <As>
   <A>
    <Id>144</Id>
    <Name>Len</Name>
    <Bs>
     <B>
      <N1>1</N1>
      <N2>c</N2>
    </B>
    </Bs>
   </A>
   <A>
    <Id>30</Id>
    <Name>Cr</Name>
   </A>
   <A>
    <Id>29</Id>
    <Name>Cb</Name>
   </A>
   <A>
    <Id>09</Id>
    <Name>Wh</Name>
    <Bs>
     <B>
      <N1>1</N1>
      <N2>s</N2>
     </B>
    </Bs>
   </A>
   <A>
    <Id>01</Id>
    <Name>Ag</Name>
   </A>
   <A>
    <Id>85</Id>
    <Name>Be</Name>
    <Bs>
     <B>
      <N1>1</N1>
      <N2>rS</N2>
     </B>
     <B>
      <N1>3</N1>
      <N2>st</N2>
     </B>
     <B>
      <N1>12</N1>
      <N2>ro</N2>
     </B>
    </Bs>
   </A>
  </As>

теперь я читаю данные в xmlDocument

 dim ds as new dataset
 dim xmlDoc as New XmlDocument
 ds.ReadXml(sFilename)
 datagridview1.datasource = ds.tables(0)  ' or 1 or 2 to display contents

Теперь каждая из записей ds.tables (2) принадлежит определенной записи в ds.tables (0).У ds.tables (1) есть 3 элемента, но при выборе ничего не нужно отображать в сетке данных (поэтому ссылка должна быть здесь, но я не знаю, как она работает).

У меня вопрос, где находится индекс (?) значение, которое связывает 2 вместе?Если мы посмотрим на 3-ю строку в таблице As (ds.table (0)), это будет указывать на 2-ю строку в таблице Bs (ds.table (2)).

1 Ответ

0 голосов
/ 07 июня 2018

Метод чтения данных XML поддерживает только XML с ограниченным числом потомков.Первым тегом слоя является имя набора данных.Тэг второго слоя - это имена DataTable.Третий уровень - это имена столбцов.Четвертый уровень - строка данных.Когда вы превышаете четыре уровня, Read Xml создает фрагментированные таблицы данных, в которых данные не могут быть правильно объединены.Лучше разбирать код вручную, как показано ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;


namespace ConsoleApplication48
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("A ID", typeof(string));
            dt.Columns.Add("A Name", typeof(string));
            dt.Columns.Add("B Tagname", typeof(string));
            dt.Columns.Add("B Value", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);

            foreach (XElement a in doc.Descendants("A"))
            {
                string id = (string)a.Element("Id");
                string name = (string)a.Element("Name");
                if (!a.Descendants("B").Any())
                {
                    dt.Rows.Add(new object[] { id, name});
                }
                else
                {
                    foreach (XElement b in a.Descendants("B"))
                    {
                        foreach (XElement element in b.Elements())
                        {
                            string tagname = element.Name.LocalName;
                            string value = (string)element;

                            dt.Rows.Add(new object[] { id, name, tagname, value });
                        }
                    }
                }
            }
        }
    }
}
...