C# 读出XML每个节点的值

Eric290 2009-03-31 04:45:28
xml文档如下:
<?xml version="1.0" encoding="UTF-8"?>
<packet>
<proto name="geninfo" pos="0" showname="General information" size="1470">
<field name="num" pos="0" show="1" showname="Number" value="1" size="1470"/>
<field name="len" pos="0" show="1470" showname="Packet Length" value="5be" size="1470"/>
<field name="caplen" pos="0" show="1470" showname="Captured Length" value="5be" size="1470"/>
<field name="timestamp" pos="0" show="Mar 25, 2009 11:59:55.676114000" showname="Captured Time" value="1237953595.676114000" size="1470"/>
</proto>
<proto name="frame" showname="Frame 1 (1470 bytes on wire, 1470 bytes captured)" size="1470" pos="0">
<field name="frame.time" showname="Arrival Time: Mar 25, 2009 11:59:55.676114000" size="0" pos="0" show="Mar 25, 2009 11:59:55.676114000"/>
<field name="frame.time_delta" showname="Time delta from previous captured frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
<field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
<field name="frame.time_relative" showname="Time since reference or first frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
<field name="frame.number" showname="Frame Number: 1" size="0" pos="0" show="1"/>
<field name="frame.pkt_len" showname="Packet Length: 1470 bytes" hide="yes" size="0" pos="0" show="1470"/>
<field name="frame.len" showname="Frame Length: 1470 bytes" size="0" pos="0" show="1470"/>
<field name="frame.cap_len" showname="Capture Length: 1470 bytes" size="0" pos="0" show="1470"/>
<field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
<field name="frame.protocols" showname="Protocols in frame: eth:ip:udp:data" size="0" pos="0" show="eth:ip:udp:data"/>
</proto>
<proto>
.
.
.
</proto>
</packet>
我想要读取XML每个节点showname和show的值,代码我已经写了,但是显示有问题...
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\\wireshark.XML");
XmlNode root = xmlDoc.DocumentElement;
for (int i = 0; i < root.SelectNodes("packet").Count; i++)
{
for (int j = 0; i < root.SelectNodes("packet")[i].SelectNodes("proto").Count;j++ )
{
XmlNode field = root.SelectNodes("packet")[i].SelectNodes("proto")[j].SelectSingleNode("field");
string showname = field.Attributes["showname"].Value;
string show = field.Attributes["show"].Value;
Console.WriteLine(showname);
Console.WriteLine(show);
for (int k = 0; k < root.SelectNodes("packet")[i].SelectNodes("proto")[j].SelectNodes("field")[k].SelectNodes("field").Count; k++)
{
XmlNode fields = root.SelectNodes("packet")[i].SelectNodes("proto")[j].SelectNodes("field")[k].SelectSingleNode("field");
string showname1 = fields.Attributes["showname"].Value;
Console.WriteLine(showname1);
}
}
}

出现的问题是<proto>中有多个<field>但显示出来的只有第一个<field>的showname 和show的值....
希望大虾帮忙



...全文
231 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanshuang0818 2009-04-01
  • 打赏
  • 举报
回复
收藏 呵呵
Eric290 2009-04-01
  • 打赏
  • 举报
回复
谢谢大家啊....
lfywy 2009-04-01
  • 打赏
  • 举报
回复
楼上都有答案了
Teng_s2000 2009-03-31
  • 打赏
  • 举报
回复
黑压压的一片,还不知道xml是否封闭
DREAM_LSQ 2009-03-31
  • 打赏
  • 举报
回复

XmlNodeList xmlNL = doc.SelectNodes(@"//field");//读出所有field元素

foreach(XmlNode xmlN in xmlNL) //遍历所有field元素,把属性值显示出来
{
Console.WriteLine(xmlN.Attribute["showname"].value.toString()+" "+ xmlN.Attribute["show"].value.toString());

}
我姓区不姓区 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 youliting290 的回复:]
<packet>包不是只有一个,有多个数据包
算下来还要加循环
[/Quote]
递归一下不就好了:

static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load("C:\\wireshark.XML");
foreach (XmlNode node in doc.GetElementsByTagName("packet"))
GetNodes(node);
}

static void GetNodes(XmlNode node)
{
if (node.Attributes["showname"] != null && node.Attributes["show"] != null)
Console.WriteLine("{0},{1}", node.Attributes["showname"].Value, node.Attributes["show"].Value);
foreach (XmlNode xn in node.ChildNodes)
GetNodes(xn);
}
yooyoozoo 2009-03-31
  • 打赏
  • 举报
回复
SelectNodes
wuyq11 2009-03-31
  • 打赏
  • 举报
回复
递归实现循环查询值
cppfaq 2009-03-31
  • 打赏
  • 举报
回复
有Xsd约束文档结构么?
wesleyluo 2009-03-31
  • 打赏
  • 举报
回复
顶起,学习下。
Eric290 2009-03-31
  • 打赏
  • 举报
回复
<packet>包不是只有一个,有多个数据包
算下来还要加循环
Eric290 2009-03-31
  • 打赏
  • 举报
回复
<field>下面还有<field>子节点

<field name="udp.checksum" showname="Checksum: 0xa147 [validation disabled]" size="2" pos="40" show="0xa147" value="a147">
<field name="udp.checksum_good" showname="Good Checksum: False" size="2" pos="40" show="0" value="a147"/>
<field name="udp.checksum_bad" showname="Bad Checksum: False" size="2" pos="40" show="0" value="a147"/>
</field>
又该继续循环...希望完善
zhuanshen712 2009-03-31
  • 打赏
  • 举报
回复
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\\wireshark.XML");
XmlElement root = xmlDoc.DocumentElement;
for (int i = 0; i < root.GetElementsByTagName("proto").Count; i++) //得到TagName为proto的节点数组
{
XmlNode par=root.GetElementsByTagName("proto")[i];//这个数组的每一项(即:一个proto节点)
for (int j = 0; j < par.ChildNodes.Count;j++ )//遍历每一个proto节点的孩子节点
{
XmlNode field = par.ChildNodes[j];//得到proto节点的第j各孩子节点,既为field节点
string showname = field.Attributes["showname"].Value;
string show = field.Attributes["show"].Value;
Console.WriteLine(showname);
Console.WriteLine(show);
}

}
jcyluck 2009-03-31
  • 打赏
  • 举报
回复
            XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"C:\\wireshark.XML");
XmlNode root = xmlDoc.DocumentElement;
for (int i = 0; i < root.SelectNodes("packet").Count; i++)
{
int ch=root.SelectNodes("packet")[i].ChildNodes.Count;
for (int j = 0; i < ch; j++)
{
XmlNode field = root.SelectNodes("packet")[i].ChildNodes[j];
string showname = field.Attributes["showname"].Value;
string show = field.Attributes["show"].Value;
Console.WriteLine(showname);
Console.WriteLine(show);
int ch1 = field.ChildNodes.Count;
for (int k = 0; k < ch1; k++)
{
XmlNode fields = field.ChildNodes[k];
string showname1 = fields.Attributes["showname"].Value;
Console.WriteLine(showname1);
}
}
}


如何你的XML文件确定只有两层可以用你的方法
如果不能确定节点的级别,建议你用递归
我姓区不姓区 2009-03-31
  • 打赏
  • 举报
回复

XmlDocument doc = new XmlDocument();
doc.Load("C:\\wireshark.XML");
foreach (XmlNode node in doc.GetElementsByTagName("proto"))
{
foreach (XmlNode xn in node.ChildNodes)
{
Console.WriteLine(xn.Attributes["showname"].Value + "," + xn.Attributes["show"].Value);
}
}
linaren 2009-03-31
  • 打赏
  • 举报
回复
XmlNodeList fields = root.SelectNodes("packet")[i].SelectNodes("proto")[j].SelectNodes("field");
zhuanshen712 2009-03-31
  • 打赏
  • 举报
回复
root.SelectNodes("packet")[i].SelectNodes("proto")[j]这个就是 XmlNode field 了吧?
=======
XmlNode field = root.SelectNodes("packet")[i].SelectNodes("proto")[j].SelectSingleNode("field");
改成:XmlNode field = root.SelectNodes("packet")[i].SelectNodes("proto")[j];
试试看
justindreams 2009-03-31
  • 打赏
  • 举报
回复
SelectSingleNode,选单个
SelectNodes,选多个
或者循环读取
或者递归读取
gxtiou 2009-03-31
  • 打赏
  • 举报
回复
SelectSingleNode呀 就是选出单个的意思
SelectNodes

111,126

社区成员

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

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

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