xml - 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 行。
解决方案
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 });
}
}
}
}
}
}
}
推荐阅读
- javascript - 我正在使用 Jquery 来定位我的徽标的“src”属性和
- javascript - 如何在 javascript (Odoo11) 中读取 Qweb 变量
- authentication - 如何在 Xamarin MobileServiceClient 中处理过期的身份验证令牌?
- python-2.7 - 在单独的行上打印多个变量 Python 2
- c# - C# Spire Document.SaveToStream 不工作
- python - 用于 lambda = 0 的 pyLDAvis 的条形宽度的含义
- java - 是否可以在 CodenameOne 中实现一个命令,一旦按下按钮而不使用 URL,它将显示 PDF
- web-component - 扩展自定义元素 Web 组件 v1
- reactjs - 兄弟组件中的 Redux 永远不会被调用?
- javascript - 多个 if 语句在 Javascript 中不起作用