入坑写代码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的基本思路就是:

  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文件的主要内容,如果未能解决你的问题,请参考以下文章

C#解析JSON文件和XML文件(2021.05.26)

C# XML 解析问题

在 C# 中解析 XML 数据并显示到 ListBox

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

在 C# 代码中解析(大)XML 的最佳方法是啥?

C# 将 XML 文件从给定标签解析为对象