使用Asp.net c#在DataSet中读取4层嵌套的xml数据
本文关键字:嵌套 4层 xml 数据 读取 net Asp DataSet 使用 | 更新日期: 2023-09-27 18:08:15
我使用XML来存储数据。并有如下所示的四层嵌套
<?xml version="1.0" encoding="utf-8" ?>
<resrourceInfo>
<month name="jan">
<r>
<rqstType></rqstType>
<rsrceName></rsrceName>
<dateRqstd></dateRqstd>
</r>
<r>
<rqstType></rqstType>
<rsrceName></rsrceName>
<dateRqstd></dateRqstd>
</r>
</month>
<month name="feb">
<r>
<rqstType></rqstType>
<rsrceName></rsrceName>
<dateRqstd></dateRqstd>
</r>
<r>
<rqstType></rqstType>
<rsrceName></rsrceName>
<dateRqstd></dateRqstd>
</r>
</month>
</resourceInfo>
我想把这个模式当作
- 所有月份作为表
- 所有的r作为行
- r内的所有标签作为Columns
我使用c#,如下所示
DataSet ds = new DataSet();
ds.ReadXml(HttpContext.Current.Server.MapPath("~/DB.xml"));
但是它没有像预期的那样工作。还有别的办法吗?
XML未保存为数据集。所以你可以这样写
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string input =
"<?xml version='"1.0'" encoding='"utf-8'" ?>" +
"<resrourceInfo>" +
"<month name='"jan'">" +
"<r>" +
"<rqstType>1</rqstType>" +
"<rsrceName>2</rsrceName>" +
"<dateRqstd>3</dateRqstd>" +
"</r>" +
"<r>" +
"<rqstType>4</rqstType>" +
"<rsrceName>5</rsrceName>" +
"<dateRqstd>6</dateRqstd>" +
"</r>" +
"</month>" +
"<month name='"feb'">" +
"<r>" +
"<rqstType>7</rqstType>" +
"<rsrceName>8</rsrceName>" +
"<dateRqstd>9</dateRqstd>" +
"</r>" +
"<r>" +
"<rqstType>10</rqstType>" +
"<rsrceName>11</rsrceName>" +
"<dateRqstd>12</dateRqstd>" +
"</r>" +
"</month>" +
"</resrourceInfo>";
XDocument doc = XDocument.Parse(input);
DataSet ds = new DataSet();
foreach (XElement month in doc.Descendants("month"))
{
DataTable dt = ds.Tables.Add(month.Attribute("name").Value);
foreach (XElement row in month.Elements("r"))
{
if (dt.Rows.Count < 1)
{
foreach (XElement col in row.Elements())
{
dt.Columns.Add(col.Name.ToString(), typeof(int));
}
}
DataRow newRow = dt.Rows.Add();
foreach (XElement col in row.Elements())
{
newRow[col.Name.ToString()] = col.Value;
}
}
}
}
}
}