猿问

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

我有一个 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);


鸿蒙传说
浏览 189回答 1
1回答

湖上湖

我使用了 XmlReader 和 Xml Linq 的组合。下面的代码将元素放入字典中。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml;using System.Xml.Linq;namespace ConsoleApplication63{&nbsp; &nbsp; class Program&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; const string FILENAME = @"c:\temp\test.xml";&nbsp; &nbsp; &nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XmlReader reader = XmlReader.Create(FILENAME);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (!reader.EOF)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (reader.Name != "managedObject")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reader.ReadToFollowing("managedObject");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!reader.EOF)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; XElement managedObject = (XElement)XElement.ReadFrom(reader);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ManagedObject newObject = new ManagedObject();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ManagedObject.objects.Add(newObject);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newObject.mClass = (string)managedObject.Attribute("class");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newObject.distName = (string)managedObject.Attribute("distName");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newObject.hierachy = newObject.distName.Split(new char[] { '/' });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newObject.objectdict = managedObject.Elements()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .GroupBy(x => (string)x.Attribute("name"), y => (string)y)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .ToDictionary(x => x.Key, y => y.FirstOrDefault());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ManagedObjectNode.CreateTree();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public class ManagedObject&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public static List<ManagedObject> objects = new List<ManagedObject>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public Dictionary<string, string> objectdict { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public string distName { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public string mClass { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public string[] hierachy { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public class ManagedObjectNode&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public static ManagedObjectNode root = new ManagedObjectNode();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public Dictionary<string, ManagedObjectNode> children { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public List<ManagedObject> leaves { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public string nodeName { get; set; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public static void CreateTree()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root.nodeName = "root";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GetTreeRecursive(root, ManagedObject.objects, 0);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public static void GetTreeRecursive(ManagedObjectNode parent, List<ManagedObject> mObjects, int level)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var groups = mObjects.GroupBy(x => x.hierachy[level]).ToList();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var group in groups)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ManagedObjectNode newNode = new ManagedObjectNode();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newNode.nodeName = group.Key;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (parent.children == null) parent.children = new Dictionary<string, ManagedObjectNode>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent.children.Add(group.Key, newNode);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newNode.leaves = group.Where(x => x.hierachy.Count() - 1 == level).ToList();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; List<ManagedObject> hasChildren = group.Where(x => x.hierachy.Count() - 1 > level).ToList();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (hasChildren.Count() > 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GetTreeRecursive(newNode, hasChildren, level + 1);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}这是我使用的xml?xml version="1.0" encoding="utf-8" ?><root>&nbsp; <managedObject class="JTS" version="BSC17" distName="PLMN-PLMN/BSC-404500">&nbsp; &nbsp; <p name="name">VM_25261_G1_A</p>&nbsp; &nbsp; <p name="cellBarQualify">0</p>&nbsp; &nbsp; <p name="cellBarred">0</p>&nbsp; &nbsp; <p name="cId">25261</p>&nbsp; &nbsp; <p name="hoppingMode">1</p>&nbsp; &nbsp; <p name="hoppingSequenceNumber1">54</p>&nbsp; </managedObject>&nbsp; <managedObject class="CCF" version="BSC17" distName="PLMN-PLMN/BSC-404500">&nbsp; &nbsp; <p name="name">ET_AR_G_0267_GHABATGHAYATI</p>&nbsp; &nbsp; <p name="SBTSId">10267</p>&nbsp; &nbsp; <p name="abisInterfaceConnectionType">2</p>&nbsp; &nbsp; <p name="adminState">1</p>&nbsp; </managedObject>&nbsp; <managedObject class="POC" version="BSC17" distName="PLMN-PLMN/BSC-404500">&nbsp; &nbsp; <p name="alpha">0</p>&nbsp; &nbsp; <p name="bepPeriod">10</p>&nbsp; &nbsp; <p name="bsTxPwrMax">0</p>&nbsp; &nbsp; <p name="bsTxPwrMax1x00">0</p>&nbsp; </managedObject></root>
随时随地看视频慕课网APP
我要回答