如何遍历xml

lgstudyvc 2013-01-05 08:11:25
xml文件如下,不知怎么遍历出所有值,求教

<?xml version="1.0" encoding="gb2312"?>
<userinfo>
<clas uid="1" uno="101" uname="a" utype="1">
<guid gname="wx" gtype="3" />
<home addr="" mobil="" mail=""/>
<friendm>
<friendm fnum="" fname="" />
</friendm>
<friendwm fnum="" fname=""/>
</clas>
<clas uid="2" uno="102" uname="b" utype="1">
<guid gname="we" gtype="3" />
<home addr="" mobil="" mail=""/>
<friendm>
<friendm fnum="" fname="" />
</friendm>
<friendwm fnum="" fname=""/>
</clas>
<clas uid="3" uno="1011" uname="c" utype="1">
<guid gname="zf" gtype="3" />
<home addr="" mobil="" mail=""/>
<friendm>
<friendm fnum="" fname="" />
</friendm>
<friendwm fnum="" fname=""/>
</clas>
</userinfo>
...全文
441 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgstudyvc 2013-01-06
  • 打赏
  • 举报
回复
引用 26 楼 du1yi1dao 的回复:
或者如何进行反序列化呢 xml在vc中很好操作,c#刚用啊
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
lgstudyvc 2013-01-06
  • 打赏
  • 举报
回复
我把xml简化了下 <userinfo> <clas uid="1"> <uinfo uno="101" uname="a" utype="1" addr="" mobil="" mail="" fruum="3"/> </clas> <clas uid="2"> <uinfo uno="102" uname="b" utype="1" addr="" mobil="" mail="" fruum="4"/> </clas> <clas uid="3"> <uinfo uno="103" uname="c" utype="1" addr="" mobil="" mail="" fruum="5"/> </clas> <!-- 很多个 --> </userinfo> 我想同时读取 clas、uinfo下的值 请指教!
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
引用 23 楼 jeepxiaozi 的回复:
我觉得你可以去看下XML序列化和反序列化方面的资料,如果你的XML文件中的数据很多的话,用序列化会比你遍历节点快一些
说的很对,楼主要是xml文件够多的话 还是反序列化 处理起来更好一些!
一把汤勺 2013-01-06
  • 打赏
  • 举报
回复
我觉得你可以去看下XML序列化和反序列化方面的资料,如果你的XML文件中的数据很多的话,用序列化会比你遍历节点快一些
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
引用 20 楼 lgstudyvc 的回复:
引用 18 楼 du1yi1dao 的回复:引用 15 楼 lgstudyvc 的回复: 引用 14 楼 du1yi1dao 的回复:引用 12 楼 lgstudyvc 的回复: 引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历……
原理是一样的 XmlDocument xd = new XmlDocument(); string xmlpath = Server.MapPath("XMLFile1.xml");//加载你的xml文件 xd.Load(@xmlpath); XmlElement xmlRoot = xd.DocumentElement; XmlNode node = xmlRoot.SelectSingleNode("/userinfo"); foreach (XmlNode xn in node.ChildNodes) { if (xn.Name == "clas")//循环所有的clas { foreach (XmlNode xa in xn.ChildNodes) { if (xa.Name == "guid") { if (xa.Attributes.Count > 0) { for (int i = 0; i < xa.Attributes.Count; i++)//循环属性 { if (xa.Attributes[i].Name == "gname") Response.Write("属性值:" + xa.Attributes[i].Value + "</br>"); if (xa.Attributes[i].Name == "gtype") Response.Write("属性值:" + xa.Attributes[i].Value + "</br>"); } } } } if (xn.Attributes.Count > 0) { for (int i = 0; i < xn.Attributes.Count; i++)//循环属性 { if (xn.Attributes[i].Name == "uid") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uno") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uname") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); } } } } 我这样处理也行, 另外一种思路: 如果你循环的次数多的话 用递归去处理更方便
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
引用 20 楼 lgstudyvc 的回复:
引用 18 楼 du1yi1dao 的回复:引用 15 楼 lgstudyvc 的回复: 引用 14 楼 du1yi1dao 的回复:引用 12 楼 lgstudyvc 的回复: 引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历……
原理是一样的 XmlDocument xd = new XmlDocument(); string xmlpath = Server.MapPath("XMLFile1.xml");//加载你的xml文件 xd.Load(@xmlpath); XmlElement xmlRoot = xd.DocumentElement; XmlNode node = xmlRoot.SelectSingleNode("/userinfo"); foreach (XmlNode xn in node.ChildNodes) { if (xn.Name == "clas")//循环所有的clas { foreach (XmlNode xa in xn.ChildNodes) { if (xa.Name == "guid") { if (xa.Attributes.Count > 0) { for (int i = 0; i < xa.Attributes.Count; i++)//循环属性 { if (xa.Attributes[i].Name == "gname") Response.Write("属性值:" + xa.Attributes[i].Value + "</br>"); if (xa.Attributes[i].Name == "gtype") Response.Write("属性值:" + xa.Attributes[i].Value + "</br>"); } } } } if (xn.Attributes.Count > 0) { for (int i = 0; i < xn.Attributes.Count; i++)//循环属性 { if (xn.Attributes[i].Name == "uid") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uno") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uname") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); } } } } 我这样处理也行, 另外一种思路: 如果你循环的次数多的话 用递归去处理更方便
lgstudyvc 2013-01-06
  • 打赏
  • 举报
回复
引用 18 楼 du1yi1dao 的回复:
引用 15 楼 lgstudyvc 的回复: 引用 14 楼 du1yi1dao 的回复:引用 12 楼 lgstudyvc 的回复: 引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历取出里面的所有属性的值; 就是想这样:找到第一个clas,取出其下的……
多谢,可以! 但是在循环里怎么能同时找到guid节点下的属性值呢?
tian5867697 2013-01-06
  • 打赏
  • 举报
回复
谢谢谢谢谢谢谢谢
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
引用 15 楼 lgstudyvc 的回复:
引用 14 楼 du1yi1dao 的回复:引用 12 楼 lgstudyvc 的回复: 引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历取出里面的所有属性的值; 就是想这样:找到第一个clas,取出其下的所有值,然后再下一个c……
另外一种不用加<root>也可以 直接根目录读取: XmlDocument xd = new XmlDocument(); string xmlpath = Server.MapPath("XMLFile1.xml");//加载你的xml文件 xd.Load(@xmlpath); XmlElement xmlRoot = xd.DocumentElement; XmlNode node = xmlRoot.SelectSingleNode("/userinfo"); foreach (XmlNode xn in node.ChildNodes) { if (xn.Name == "clas")//循环所有的clas { if (xn.Attributes.Count > 0) { for (int i = 0; i < xn.Attributes.Count; i++)//循环属性 { if (xn.Attributes[i].Name == "uid") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uno") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uname") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); } } } }
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
引用 15 楼 lgstudyvc 的回复:
引用 14 楼 du1yi1dao 的回复:引用 12 楼 lgstudyvc 的回复: 引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历取出里面的所有属性的值; 就是想这样:找到第一个clas,取出其下的所有值,然后再下一个c……
按照我16楼写的不会有什么问题 我已经测试过了 你可以按照另外一种思路 从根目录读取也行的 再有什么问题的话 再回复吧!
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
引用 15 楼 lgstudyvc 的回复:
引用 14 楼 du1yi1dao 的回复:引用 12 楼 lgstudyvc 的回复: 引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历取出里面的所有属性的值; 就是想这样:找到第一个clas,取出其下的所有值,然后再下一个c……
XmlDocument xd = new XmlDocument(); string xmlpath = Server.MapPath("XMLFile1.xml");//加载你的xml文件 xd.Load(@xmlpath); XmlElement xmlRoot = xd.DocumentElement; XmlNode node = xmlRoot.SelectSingleNode("userinfo"); foreach (XmlNode xn in node.ChildNodes) { if (xn.Name == "clas")//循环所有的clas { if (xn.Attributes.Count > 0) { for (int i = 0; i < xn.Attributes.Count; i++)//循环属性 { if (xn.Attributes[i].Name == "uid") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uno") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uname") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); } } } } 你把userinfo外面加一个root就可以了 例如<root><userinfo> </userinfo></root> 你加好root以后 在把我现在发的代码试试就可以了 另外一种思路 或者你直接从根目录读取也行
yinghuigu 2013-01-06
  • 打赏
  • 举报
回复
dataset读取字符串应该没有大小的限制吧。 还有这个字符串当然是xml格式的啊,中间的""代表",是转义的
lgstudyvc 2013-01-06
  • 打赏
  • 举报
回复
引用 14 楼 du1yi1dao 的回复:
引用 12 楼 lgstudyvc 的回复: 引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历取出里面的所有属性的值; 就是想这样:找到第一个clas,取出其下的所有值,然后再下一个clas,直到找完、取完。 我13楼发的那段代码,直接就可以用,把xm……
用了 XmlNode node = xmlRoot.SelectSingleNode("userinfo"); node为null啊
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
引用 12 楼 lgstudyvc 的回复:
引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历取出里面的所有属性的值; 就是想这样:找到第一个clas,取出其下的所有值,然后再下一个clas,直到找完、取完。
我13楼发的那段代码,直接就可以用,把xml名字改一下就行, 在有什么问题? 请详细说明
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
引用 12 楼 lgstudyvc 的回复:
引用 10 楼 du1yi1dao 的回复:你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清, 这个xml有很多clas节点,我想遍历取出里面的所有属性的值; 就是想这样:找到第一个clas,取出其下的所有值,然后再下一个clas,直到找完、取完。
XmlDocument xd = new XmlDocument(); string xmlpath = Server.MapPath("name.xml");//加载你的xml文件 xd.Load(@xmlpath); XmlElement xmlRoot = xd.DocumentElement; XmlNode node = xmlRoot.SelectSingleNode("userinfo"); foreach (XmlNode xn in node.ChildNodes) { if (xn.InnerText == "clas")//循环所有的clas { if (xn.Attributes.Count > 0) { for (int i = 0; i < xn.Attributes.Count; i++)//循环属性 { if (xn.Attributes[i].Name == "uid") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uno") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); if (xn.Attributes[i].Name == "uname") Response.Write("属性值:" + xn.Attributes[i].Value + "</br>"); } } } }
lgstudyvc 2013-01-06
  • 打赏
  • 举报
回复
引用 10 楼 du1yi1dao 的回复:
你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清,
这个xml有很多clas节点,我想遍历取出里面的所有属性的值; 就是想这样:找到第一个clas,取出其下的所有值,然后再下一个clas,直到找完、取完。
lgstudyvc 2013-01-06
  • 打赏
  • 举报
回复
引用 9 楼 stonespace 的回复:
这种文件,遍历没用,建议使用SelectNodes用XPath表达式查询你需要的节点,放在一个线性链表中,
感谢,
du1yi1dao 2013-01-06
  • 打赏
  • 举报
回复
你把你的xml简化一下 说明你要取什么值?我们才可以提供帮助 你这一大堆放上去了 说都没说清,
lgstudyvc 2013-01-06
  • 打赏
  • 举报
回复
引用 29 楼 yinghuigu 的回复:
用dataset也是一个方法的 C# code ? 123456789101112131415161718192021222324252627 string xml = @"<userinfo> <clas uid=""1""> <uinfo uno=""101"" uname=""a"" utype=""1"" addr="""" ……
请问:DataSet是不对一个很大的字符串进行读取的?这个字符串是xml格式的?
加载更多回复(11)

110,538

社区成员

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

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

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