首页 > 解决方案 > VB.net XML 到 DataSet - 不同 DataTables 项之间的关系

问题描述

我是 XML 新手,我正在尝试学习如何使用 DataTables 将 XML 转换为 DataSet。(然后稍后再次保存 - 不循环浏览文件)。我的 XML 有两种我标记为 As 和 Bs 的分组。B 是 As 的子组,可以包含零个或多个 B 元素。第一个表是As,第三个是B,第二个我相信包含哪些B属于哪个As的信息,但这是我不明白的部分。

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 个项目,但在选择时不会在 datagridview 中显示(因此链接必须在此处,但我不知道它是如何工作的)。

我的问题是将 2 关联在一起的索引(?)值在哪里?如果我们查看 As 表 (ds.table(0)) 中的第 3 行,这将指向 Bs 表 (ds.table(2)) 中的第 2 行。

标签: xmlvb.netdatatabledataset

解决方案


Datatable 读取 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 });
                        }
                    }
                }
            }
        }
    }
}

推荐阅读