搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 马克布克打字机 > 入坑写代码1——c#解析xml文件

入坑写代码1——c#解析xml文件

马克布克打字机 2018-04-12
举报

       先说下背景:统一采集平台每天会从网管采集各种配置文件、网络数据等信息,并以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的基本思路就是:

  1. 将xml文件Load进来,以元素名称作为key,以元素的值作为value,返回一个dic<string,string>;

  2. 遍历每一个TOPOLOGICALLINK元素;

  3. 对于一个TOPOLOGICALLINK元素,遍历他的子代元素ele;

  4. 若子代元素ele里有item,则取ele.name + item.Element("name").value作为key,取item("value").value作为value,返回key-value;

  5. 若子代元素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的解析就妥了,但领导后续的需求也暴露出了当前解析代码的不足,具体有:

  1. 当前代码是直接load文件到内存,TopologicalLink才10M不到,后边还有2G的xml文件;

  2. TopologicalLink最深也就3层就到item元素了,当前代码赤裸裸的只下钻了2层,后续领导又提出了好几块网络数据的xml也要做处理,难道每种xml文件写一个解析?

  3. 如果有同名元素怎么办,比如后续会有隧道路由表,里边各条隧道的跳数(即经过的网元数)是不同的,每一跳都用一个IpCrossConnection元素做记录,一条隧道经过的全部IpCrossConnection又保存在一个IpCrossConnectionList下;


走着瞧了呗,还能咋办。


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《入坑写代码1——c#解析xml文件》的版权归原作者「马克布克打字机」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注马克布克打字机微信公众号

马克布克打字机微信公众号:BearView_hn

马克布克打字机

手机扫描上方二维码即可关注马克布克打字机微信公众号

马克布克打字机最新文章

精品公众号随机推荐

举报