入坑写代码1——c#解析xml文件
Posted 马克布克打字机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入坑写代码1——c#解析xml文件相关的知识,希望对你有一定的参考价值。
先说下背景:统一采集平台每天会从网管采集各种配置文件、网络数据等信息,并以xml文件形式保存在ftp下。
再说下工作安排:领导想将每天的采集到的网络拓扑连接信息(即网元A的某端口,有一条连纤,连接至网元B的某端口)保存在数据库里,即解析xml文件并导入数据库。
每天采集到的网络拓扑连接信息xml文件,即TopologicalLink.xml,里边大概长这样:
1<DATA>
2 <TOPOLOGICALLINK>
3 </TOPOLOGICALLINK>
4 <TOPOLOGICALLINK>
5 </TOPOLOGICALLINK>
6</DATA>
整个xml文档由多个TopologicalLink元素构成,每个TopologicalLink展开里面大概长这样:
1<?xml version="1.0" encoding="GBK"?>
2<DATA>
3 <TOPOLOGICALLINK>
4 <name>
5 <item>
6 <name>EMS</name>
7 <value>AN-U2000-4-P</value>
8 </item>
9 <item>
10 <name>TopologicalLink</name>
11 <value>2009-09-23 02:26:32 - 3661</value>
12 </item>
13 </name>
14 <userLabel></userLabel>
15 <nativeEMSName>f-10</nativeEMSName>
16 <owner></owner>
17 <direction>BI</direction>
18 <rate>20</rate>
19 <aEnd>
20 <item>
21 <name>EMS</name>
查看完xml基础知识,在网上找到个DataSet.readxml,但测试起来发现read出来的table结构没看懂,且一些dataTable下的数据是空的。
后来看到了XElement,所以解析这个TopologicalLink.xml的基本思路就是:
将xml文件Load进来,以元素名称作为key,以元素的值作为value,返回一个dic<string,string>;
遍历每一个TOPOLOGICALLINK元素;
对于一个TOPOLOGICALLINK元素,遍历他的子代元素ele;
若子代元素ele里有item,则取ele.name + item.Element("name").value作为key,取item("value").value作为value,返回key-value;
若子代元素ele里没有item,则ele.name作为key,ele.value作为value;
代码主要部分如下:
1IEnumerable<XElement> MatchElements = from temp in loadxml.Elements("TOPOLOGICALLINK")
2 select temp;
3 Dictionary<string, string> dic = new Dictionary<string, string>();
4 //步骤2
5 //遍历每一个TOPOLOGICALLINK元素
6 foreach (var MatchEle in MatchElements)
7 {
8 //步骤3
9 IEnumerable<XElement> eleInMatchEle = MatchEle.Elements();
10 foreach (XElement ele in eleInMatchEle)
11 {
12 IEnumerable<XElement> items = from temp in ele.Elements("item")
13 select temp;
14 //步骤4
15 if (items.Count() > 0)
16 {
17 foreach (var item in items)
18 {
19 strKey = ele.Name.ToString() + "_" + item.Element("name").Value.ToString();
20 strValue = item.Element("value").Value.ToString();
21 if (dic.ContainsKey(strKey) == false)
22 {
23 dic.Add(strKey, strValue);
24 }
25 }
26 }
27 // 步骤5
28 else
29 {
30 strKey = ele.Name.ToString();
31 strValue = ele.Value.ToString();
32 if (dic.ContainsKey(strKey) == false)
33 {
34 dic.Add(strKey, strValue);
35 }
36 }
37 }
38 // 清空字典,准备下一个TOPOLOGICALLINK
39 dic.Clear();
40 }
输出到控制台看一下一个TopologicalLink元素能解析成啥样,通过下边的代码来看输出的结果:
1Console.WriteLine("------{0}-------", dic.Count);
2foreach (string key in dic.Keys)
3{
4 Console.WriteLine("【{0}】{1}", key, dic[key]);
5}
6Console.WriteLine();
7Console.ReadKey();
输出结果:
这样对于TopologicalLink.xml的解析就妥了,但领导后续的需求也暴露出了当前解析代码的不足,具体有:
当前代码是直接load文件到内存,TopologicalLink才10M不到,后边还有2G的xml文件;
TopologicalLink最深也就3层就到item元素了,当前代码赤裸裸的只下钻了2层,后续领导又提出了好几块网络数据的xml也要做处理,难道每种xml文件写一个解析?
如果有同名元素怎么办,比如后续会有隧道路由表,里边各条隧道的跳数(即经过的网元数)是不同的,每一跳都用一个IpCrossConnection元素做记录,一条隧道经过的全部IpCrossConnection又保存在一个IpCrossConnectionList下;
走着瞧了呗,还能咋办。
以上是关于入坑写代码1——c#解析xml文件的主要内容,如果未能解决你的问题,请参考以下文章