为了账号安全,请及时绑定邮箱和手机立即绑定

在.net中处理xml文件需要很多时间

在.net中处理xml文件需要很多时间

C#
鸿蒙传说 2022-01-09 11:01:17
我有一个 XML 文件,其中数据分散。我必须获取驻留在 XML 标记下的所有单元格值、<managedObject class="JTS"分散在 XML 标记上的依赖站点信息以及分散在 XML 标记上的<managedObject class="CCF"其他依赖电源信息<managedObject class="POC"。我习惯于进行XmlReader.ReadFrom小部分和处理,但现在的问题是每个单元格、站点和电源信息的 XML 都很大,为此我每次都读取整个大 XML 文件,这是错误的逻辑并且需要很多的时间。有什么方法可以将所有单元格(比如 5000 个单元格)加载到类和相应的站点中,将单元格所需的任何信息提供给类,然后使用foreach迭代处理这些类。我使用的代码和 XML 片段如下<managedObject class="JTS" version="BSC17" distName="PLMN-PLMN/BSC-404500">  <p name="name">VM_25261_G1_A</p>  <p name="cellBarQualify">0</p>  <p name="cellBarred">0</p>  <p name="cId">25261</p>  <p name="hoppingMode">1</p>  <p name="hoppingSequenceNumber1">54</p>  <managedObject class="CCF" version="BSC17" distName="PLMN-PLMN/BSC-404500">    <p name="name">ET_AR_G_0267_GHABATGHAYATI</p>    <p name="SBTSId">10267</p>    <p name="abisInterfaceConnectionType">2</p>    <p name="adminState">1</p>    <managedObject class="POC" version="BSC17" distName="PLMN-PLMN/BSC-404500">      <p name="alpha">0</p>      <p name="bepPeriod">10</p>      <p name="bsTxPwrMax">0</p>      <p name="bsTxPwrMax1x00">0</p>和代码using (XmlReader xr = XmlReader.Create(path, settings)){    xr.MoveToContent();    while (xr.Read())    {        while (xr.NodeType == XmlNodeType.Element && xr.LocalName == "managedObject" && xr.GetAttribute("class") == "JTS")        {            dist_name = xr.GetAttribute("distName");            dist_name_ori = dist_name;            XElement pin = (XElement)XNode.ReadFrom(xr);            cell_name = GetValueForNokia(pin, "name");            DataTable dtSiteDetails = GetSiteDetails2G(path, dist_name, settings);            DataTable dtBasePowrDetails = GetBasePowrDetails2G(path, dist_name_ori, settings);
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

我使用了 XmlReader 和 Xml Linq 的组合。下面的代码将元素放入字典中。


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml;

using System.Xml.Linq;


namespace ConsoleApplication63

{

    class Program

    {

        const string FILENAME = @"c:\temp\test.xml";

        static void Main(string[] args)

        {

            XmlReader reader = XmlReader.Create(FILENAME);

            while (!reader.EOF)

            {

                if (reader.Name != "managedObject")

                {

                    reader.ReadToFollowing("managedObject");

                }

                if (!reader.EOF)

                {

                    XElement managedObject = (XElement)XElement.ReadFrom(reader);


                    ManagedObject newObject = new ManagedObject();

                    ManagedObject.objects.Add(newObject);


                    newObject.mClass = (string)managedObject.Attribute("class");

                    newObject.distName = (string)managedObject.Attribute("distName");

                    newObject.hierachy = newObject.distName.Split(new char[] { '/' });


                    newObject.objectdict = managedObject.Elements()

                        .GroupBy(x => (string)x.Attribute("name"), y => (string)y)

                        .ToDictionary(x => x.Key, y => y.FirstOrDefault());

                }

            }

            ManagedObjectNode.CreateTree();

        }

        public class ManagedObject

        {

            public static List<ManagedObject> objects = new List<ManagedObject>();


            public Dictionary<string, string> objectdict { get; set; }


            public string distName { get; set; }

            public string mClass { get; set; }


            public string[] hierachy { get; set; }

        }

        public class ManagedObjectNode

        {

            public static ManagedObjectNode root = new ManagedObjectNode();


            public Dictionary<string, ManagedObjectNode> children { get; set; }

            public List<ManagedObject> leaves { get; set; }

            public string nodeName { get; set; }


            public static void CreateTree()

            {

                root.nodeName = "root";

                GetTreeRecursive(root, ManagedObject.objects, 0);

            }

            public static void GetTreeRecursive(ManagedObjectNode parent, List<ManagedObject> mObjects, int level)

            {

                var groups = mObjects.GroupBy(x => x.hierachy[level]).ToList();

                foreach (var group in groups)

                {

                    ManagedObjectNode newNode = new ManagedObjectNode();

                    newNode.nodeName = group.Key;

                    if (parent.children == null) parent.children = new Dictionary<string, ManagedObjectNode>();

                    parent.children.Add(group.Key, newNode);

                    newNode.leaves = group.Where(x => x.hierachy.Count() - 1 == level).ToList();

                    List<ManagedObject> hasChildren = group.Where(x => x.hierachy.Count() - 1 > level).ToList();

                    if (hasChildren.Count() > 0)

                    {

                        GetTreeRecursive(newNode, hasChildren, level + 1);

                    }

                }

            }

        }

    }

}

这是我使用的xml


?xml version="1.0" encoding="utf-8" ?>

<root>

  <managedObject class="JTS" version="BSC17" distName="PLMN-PLMN/BSC-404500">

    <p name="name">VM_25261_G1_A</p>

    <p name="cellBarQualify">0</p>

    <p name="cellBarred">0</p>

    <p name="cId">25261</p>

    <p name="hoppingMode">1</p>

    <p name="hoppingSequenceNumber1">54</p>

  </managedObject>


  <managedObject class="CCF" version="BSC17" distName="PLMN-PLMN/BSC-404500">

    <p name="name">ET_AR_G_0267_GHABATGHAYATI</p>

    <p name="SBTSId">10267</p>

    <p name="abisInterfaceConnectionType">2</p>

    <p name="adminState">1</p>

  </managedObject>


  <managedObject class="POC" version="BSC17" distName="PLMN-PLMN/BSC-404500">

    <p name="alpha">0</p>

    <p name="bepPeriod">10</p>

    <p name="bsTxPwrMax">0</p>

    <p name="bsTxPwrMax1x00">0</p>

  </managedObject>

</root>


查看完整回答
反对 回复 2022-01-09
  • 1 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号