遍历DataSet中的xml问题

saybookcat 2010-11-17 05:40:05
问题是这样的
我把一个xml加载到一个dataset里面
有一个xml树的节点模型,需要把dataset里的数据转成对应的节点模型

xml如下

<Home name="Home" type="Home">
<Group name="Group1" type="Group">
<Library name="Library1" type="Library" description="123456" author="abc">
<Tree name="Tree1" type="Tree">1234</Tree>
<Tree name="Tree2" type="Tree">567</Tree>
<Tree name="Tree3" type="Tree">890</Tree>
</Library>
<Library name="Library2"></Library>
</Group>
<Group name="Gourp2" type="Group">
<Group name="Group3" type="Group">
<Library name="Library3" type="Library" description="dfgsdfdd" author="abc" >
<Tree name="Tree4" type="Tree"></Tree>
</Library>
</Group>
</Group>
</Home>


读取DataSet

DataSet ds = new DataSet();
ds.ReadXml(XmlPath);

XmlPaht xml路径

节点模型TreeNodeModel类

public class TreeNodeModel
{
private List<TreeNodeModel> children; // 子Model列表

public string Type { get; set; } //节点类型

public string Name { get; set; } //节点Name

public string Description { get; set; } //描述

public string Author { get; set; } //作者

public List<TreeNodeModel> Children
{
get
{
if (children == null)
children = new List<Model.TreeNodeModel>();
return children;
}
}
}


希望 添加成最后返回一个model, 这个model里的模型是
rootModel
model
model
...全文
247 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxiazuqiu123 2010-11-18
  • 打赏
  • 举报
回复
学习,学习。
liyf_liyunfeng 2010-11-18
  • 打赏
  • 举报
回复
这很简单呀,递归循环添加就可以了
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
数据库里的是表结构 ,不是存储的xml的信息
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
数据库里的事表结构 ,不是存储的xml的信息
chuanzhang5687 2010-11-17
  • 打赏
  • 举报
回复
求解释
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
现在的xml是直接以文件保存的
我的意思是 xml的数据格式是 有根节点home和多个子节点 个数不定 但节点的类型只有这几个 ,而且层次特殊的只有<Group><Group></Group></Group>这类 group下有group的节点 ,可以多层
这是一种数据来源

还有就是也有数据库存储这类信息,就是其他的结构了

所以我这里想做成DataSet的 ,到时候,数据库里的就直接弄成DataSet就可以直接使用了
jywwwerty 2010-11-17
  • 打赏
  • 举报
回复
有才顶起
damjmk2 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 saybookcat 的回复:]
多谢damjmk2
恩是的 ,直接用xmlDocument是很方便 ,只是我这里有点小问题 ,数据的来源u ,还有可能是数据库,所以现在我想直接写Dataset的转换 ,到时候 ,最好能不用修改,就可以使用

其实也不一定要Dataset 只是为了获得一个通用的结构 这里就是DataSet ,其他的也可以 例如 list<Model>
不过现在无法这么处理 ,也没办法啊
[/Quote]

你的XML在数据库中是以什么形式保存的?字符串? 文件地址? URL? 这些都能用XmlDocument直接转化
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
多谢damjmk2
恩是的 ,直接用xmlDocument是很方便 ,只是我这里有点小问题 ,数据的来源u ,还有可能是数据库,所以现在我想直接写Dataset的转换 ,到时候 ,最好能不用修改,就可以使用

其实也不一定要Dataset 只是为了获得一个通用的结构 这里就是DataSet ,其他的也可以 例如 list<Model>
不过现在无法这么处理 ,也没办法啊


damjmk2 2010-11-17
  • 打赏
  • 举报
回复
用XmlDocument 递归起来方便很多,你完全可以直接用xpath找到你想要的模型属性值
damjmk2 2010-11-17
  • 打赏
  • 举报
回复

string xml = @"<sms_list>
<sms>
<sms_id>9DEA2762C0EA4BFEB93845C5DACBFB9</sms_id>
<sms_number>13411885227</sms_number>
<sms_content>GTS*493*GTSBOXMTK*1245789865321245</sms_content>
<sms_time>0</sms_time>
</sms>
<sms>
<sms_id>F24A1E6DFCFB4147AE78B9E8DA84E61</sms_id>
<sms_number>10665234</sms_number>
<sms_content>ee29_493_20004_1_1245789865321245</sms_content>
<sms_time>0</sms_time>
</sms>
</sms_list>";
XmlDocument doc = new XmlDocument();
XmlTextReader reader = new XmlTextReader(new StringReader(xml));
doc.Load(reader);
XmlNodeList cmsList = doc.SelectNodes("sms_list/sms");
foreach (XmlNode node in cmsList)
{
XmlNode number = node.SelectSingleNode("sms_number");
Console.WriteLine(number.Value); //这里是number的值
XmlNode content = node.SelectSingleNode("sms_content");
Console.WriteLine(content.Value);//这里是content的值
}






这正好有个例子,我就搬来了
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
回9楼 无法直接让xml和最终的model模型关联 ,所以才准备使用DataSet作为中间因素
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 damjmk2 的回复:]

引用 6 楼 saybookcat 的回复:
引用 3 楼 saybookcat 的回复:

DataTable dt = new DataTable();
foreach (DataRow item in dtTree.Rows)
{


DataTable dt=dsTree.Table[0];
foreach(DataRow item in dt.Rows)
{
}
……
[/Quote]

使用XmlDocument存储的话 会是什么结构呢
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
构想是 不知道对不对

public TreeNodeModel GetTreeNodes(DataSet dsTree)
{
DataTable dt = dsTree.Tables[0]; //这里他Tables需要处理 Tabel[0]只有home节点的信息
foreach (DataRow item in dtTree.Rows)
{
model = new Model.TreeNodeModel();
model.Name = item["name"].ToString();
.......
dt.Rows.Add(item);
GetChildren(dt, model);
}
return model;
}

private void GetChildren(DataTable dt, TreeNodeModel parentModel)
{
DataTable dt = new DataTable();
foreach (....)
{
TreeNodeModel childModel = new TreeNodeModel();
childModel.Name = item["name"].ToString();
parentModel.Children.Add(childModel);
.........
GetChildren(dt, childModel);
}
}
damjmk2 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 saybookcat 的回复:]
引用 3 楼 saybookcat 的回复:

DataTable dt = new DataTable();
foreach (DataRow item in dtTree.Rows)
{


DataTable dt=dsTree.Table[0];
foreach(DataRow item in dt.Rows)
{
}
不过XML转到 DataTable 里……
[/Quote]


每一级都要建一个DataTable保存? 这样很不合理,我不支持这样做,你可以考虑用XmlDocument
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
关键是需要写递归的添加子节点的方法

markdandan 2010-11-17
  • 打赏
  • 举报
回复
用 XMLDOCUMENT 吧
saybookcat 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 saybookcat 的回复:]

DataTable dt = new DataTable();
foreach (DataRow item in dtTree.Rows)
{
[/Quote]

DataTable dt=dsTree.Table[0];
foreach(DataRow item in dt.Rows)
{
}
不过XML转到 DataTable 里的时候 Table[0]只存有Home节点的信息
Tabel[1]则存储的Group节点的信息
......
这样的话 ,这里处理就有问题了
sadsfdf 2010-11-17
  • 打赏
  • 举报
回复
顶 学习中
damjmk2 2010-11-17
  • 打赏
  • 举报
回复
你这个xml是4级的,dataset好像只有2级啊...这样可以吗
加载更多回复(2)

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧