增强 XML 解析复杂性 - c# XML 循环

2024-05-21

我正在编写自己的 C# 自定义地图导航程序。我在用打开街道地图用于地图数据。它是一个包含节点和方法的大型 XML 文件。我编写了一个转换器,可以从 XML 文件中去除无用的垃圾(如时间戳、用户等),这样文件就会变得更小。

现在,当我尝试循环 XML 并将数据转换为 C# 对象方式和节点时,我遇到了一个问题。我需要做太多循环,导致加载时间太长。

XML 示例(w = 方式,n = 节点,rf = 对节点的引用):

      <n id="2638006578" l="5.9295547" b="52.5619519" />
      <n id="2638006579" l="5.9301973" b="52.5619526" />
      <n id="2638006581" l="5.9303625" b="52.5619565" />
      <n id="2638006583" l="5.9389539" b="52.5619577" />
      <n id="2638006589" l="5.9386643" b="52.5619733" />
      <n id="2638006590" l="5.9296231" b="52.5619760" />
      <n id="2638006595" l="5.9358987" b="52.5619864" />
      <n id="2638006596" l="5.9335913" b="52.5619865" />
      <w id="453071384">
        <nd rf="2638006581" />
        <nd rf="2638006590" />
        <nd rf="2638006596" />
        <nd rf="2638006583" />
        <nd rf="2638006578" />
      </w>
      <w id="453071385">
        <nd rf="2638006596" />
        <nd rf="2638006578" />
        <nd rf="2638006581" />
        <nd rf="2638006583" />
      </w>
  • Way 节点包含对节点的引用,因此一个节点可以以多种方式存在(节点连接各路)。

  • 节点包含经度和纬度(l = lon,b = lat)。

  • 这些 XML 文件包含a lot节点和方式,所以它不仅仅是一个小文件。下面的代码示例中的 XML 文件有 500K 行。

My Code

class Program {

        static List<Way> ways = new List<Way>();
        static List<Node> nodes = new List<Node>();

        static void Main(String[] args) {
            read();
        }
        public static void read() {
            String xmlLoc = @"C:\Users\MyName\Desktop\result.xml";
            long time = DateTime.Now.Ticks;
            Parse(xmlLoc);
            long time2 = DateTime.Now.Ticks;
            Console.WriteLine("Done: {0} ms", (time2 - time) / 10000);
            Console.WriteLine(" - Nodes Amount:" + nodes.Count());
            Console.WriteLine(" - Ways Amount: " + ways.Count());
        }

        private static Node GetByRef(long reference) {
            return nodes.First(x => x.ID == reference);
        }

        private static void Parse(string path) {
            using (XmlReader reader = XmlReader.Create(path)) {
                reader.MoveToContent();
                while (reader.Read()) {
                    if (reader.NodeType == XmlNodeType.Element) {
                        XElement element = XElement.ReadFrom(reader) as XElement;
                        if ( element.Name.ToString().Equals("w")) {
                            Way w = new Way();
                            var name = element.Attribute("nm");
                            if (name != null) w.Name = name.Value;
                            var children = element.Descendants("nd");
                            foreach (XElement child in children) w.References.Add(long.Parse(child.Attribute("rf").Value));
                            ways.Add(w);
                        }else if (element.Name.ToString().Equals("n")) {
                            Node n = new Node();
                            n.ID = long.Parse(element.Attribute("id").Value);
                            n.Lon = double.Parse(element.Attribute("l").Value);
                            n.Lat = double.Parse(element.Attribute("b").Value);
                            nodes.Add(n);
                        }
                    }
                }
            }
        }
    }

    class Way {

        public List<long> References { get; private set; }
        public long ID { get; set; }
        public String Name { get; set; }
        public bool OneWay { get; set; }

        public Way() {
            this.References = new List<long>();
        }
    }

    class Node {
        public long ID { get; set; }
        public double Lat { get; set; }
        public double Lon { get; set; }
    }

目前,Way 类和 Node 类之间没有实际关系。只有一个列表long价值观。我以某种方式需要向类 Way 添加一个包含节点的列表,但这需要我使用另一个(两个?)for/while 循环。我相信这意味着 O(N4),这很慢。

从技术上讲,我正在寻找解决方案和更好地构建它的方法,如果您有建议,我想听听!

提前致谢!

PS:如果我应该更新/编辑我的问题,请告诉我,而不是立即否决。


使用 xml linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;
using System.IO;


namespace ConsoleApplication31
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XDocument xdoc = XDocument.Load(FILENAME);

            var results = xdoc.Elements("root").Select(x => new
            {
                ns = x.Descendants("n").Select(y => new {
                    id = (long)y.Attribute("id"),
                    l = (double)y.Attribute("l"),
                    b = (double)y.Attribute("b")
                }).ToList(),
                ws = x.Descendants("w").Select(y => new {
                    id = (long)y.Attribute("id"),
                    rfs= y.Descendants("nd").Select(z => (long)z.Attribute("rf")).ToList()
                }).ToList()
            }).FirstOrDefault();

        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

增强 XML 解析复杂性 - c# XML 循环 的相关文章

随机推荐

  • 在浏览器中以低延迟捕获声音输入

    是否可以在浏览器中捕获低延迟的声音输入 主要用于录制吉他 我知道这也取决于硬件 但我们假设硬件足够好 我尝试使用 Web Audio API 但它的延迟有点糟糕 是否还有其他技术可以在浏览器中提供高性能的声音输入捕获 可以使用Unity3D
  • 从目录中读取所有文件内容 - php

    这实际上是一个简单的任务 我想显示指定文件夹中所有文件的内容 我正在传递目录名称 echo a href row qname a 在第二页上 我正在迭代目录内容 while entryname readdir myDirectory if
  • sklearn LogisticRegressionCV 是否使用最终模型的所有数据

    我想知道sklearn中LogisticRegressionCV的最终模型 即决策边界 是如何计算的 假设我有一些 Xdata 和 ylabels Xdata shape of this is n samples n features yl
  • 警告:找不到模板 /usr/local/git/share/git-core/templates

    我收到这个错误警告 找不到模板 usr local git share git core templates当我在本地存储库中克隆存储库时这个链接 https github com zikula modules Scribite issue
  • scrollWidth/scrollHeight 给出无效尺寸

    如所述https developer mozilla org en Determining the dimensions of elements https developer mozilla org en Determining the
  • Eclipse RCP 产品配置中的“添加所需插件”按钮?

    我不太明白当我在 Eclipse RCP 中进行产品配置时 哪些插件构成了依赖项列表 以及 添加所需插件 按钮到底有什么作用 为什么依赖项列表从一开始就不完整 为什么我必须使用该按钮 谢谢 当您开发 RCP 应用程序时 您指定 没有足够的插
  • Saxon XSLT 转换:转换期间失败时如何关闭输出流

    我想对多个输出文件进行 XSLT 转换 我在那里使用了 xsl 结果文档 当转换失败时 应删除所有输出文件 但是 如果由 xsl result document 创建的文档生成失败 我的程序将无法再删除该文档 我认为原因是 xsl resu
  • 父级嵌入框阴影与子级 div 重叠

    我遇到一个问题 子级 div 与父级框阴影底部重叠 父级有一个 max height w overflow y 滚动 任何帮助都会很棒 https i stack imgur com jQe0r png https i stack imgu
  • Rails 中的 Google freebusy api 调用无法识别参数

    我试图从我的主日历中查找所有空闲 忙碌时间 但我无法让查询识别我的参数 在我的控制器中我有 freetimes client execute api method gt service freebusy query parameters g
  • Chrome 扩展程序在“正在发布”中停止

    我已经上传成功了Test 仅暴露给测试者帐户 生产使用我的开发者帐户的 Google Chrome 扩展程序版本 在尝试将我们的 Chrome 扩展程序迁移到新创建的 Google 群组 以便能够协作发布不同版本等 后 问题出现了 现在 我
  • 可以将 self 传递给外部函数吗

    我有一个类 A 它被许多其他类继承 其中一些有一些相似的函数 如果能在其他地方定义这些函数并由需要它们的类调用 那就太好了 但这些函数调用超类中定义的函数 class A def imp func args called by the ch
  • Laravel 保存/更新多对多关系

    谁能帮助我如何保存多对多关系 我有任务 用户可以有很多任务 任务可以有很多用户 多对多 我想要实现的是更新表格管理员可以将多个用户分配给特定任务 这是通过 html 多选输入完成的 name taskParticipants 这里的问题是
  • 打印一个模式以显示最多 5 行 5 列的数字,例如 5 4 3 2 1 和下一行 4 3 2 1 5 直到第 5 行

    这是一个正方形图案 每行有 5 列 共有 5 行 图案如下所示 5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 我的代码如下以获得模式 但当计数器达到 1 并显示在相应的列值中时 我无法重
  • 具有可变数量过滤器参数的 Django 查询

    我有一个 Django 查询 从MyModel基于某些条件 if beta MyModel object filter x alpha y beta else MyModel object filter x alpha 是否可以消除if b
  • python-social-auth 部分管道无法恢复

    我正在尝试使用 python social auth 的部分管道收集新用户的密码 由于某种未知的原因 我无法恢复管道 提交表单后页面呈现回密码收集页面 值得注意的是 即使我输入 http complete backend name 页面也会
  • 为什么 SORT_REGULAR 在 PHP 中产生不一致的结果?

    我正在开发一个类 它使 PHP 中的数组排序变得更容易 并且我一直在使用 SORT 常量 但是行为或SORT REGULAR 默认排序类型 似乎有所不同 具体取决于您在数组中添加项目的顺序 此外 我找不到任何模式来解释为什么会出现这种情况
  • NSMutableArray addObject: -[__NSArrayI addObject:]: 无法识别的选择器发送到实例

    我尝试从周日开始以 100 种方式初始化 NSMutableArray 但没有任何效果 我尝试将其设置为等于新分配和初始化的 NSMutableArray 只需分配并自行初始化变量 我能想到的每种组合都总是相同的结果 这是代码 Object
  • MATLAB 变量传递和惰性赋值

    我知道在 Matlab 中 当将新变量分配给现有变量时 会进行 惰性 评估 例如 array1 ones 1 1e8 array2 array1 的价值array1不会被复制到array2除非元素array2被修改 由此我推测Matlab中
  • 在 Django 中使用 Dajaxice 刷新表格

    我正在监测不同地点的温度 我将数据存储在模型中并设置了views py 但我想每 5 分钟刷新一次表 我是 ajax 和 dajaxice 的新手 如何编写该函数以使其显示在 html 中 这是我的观点 py def temperature
  • 增强 XML 解析复杂性 - c# XML 循环

    我正在编写自己的 C 自定义地图导航程序 我在用打开街道地图用于地图数据 它是一个包含节点和方法的大型 XML 文件 我编写了一个转换器 可以从 XML 文件中去除无用的垃圾 如时间戳 用户等 这样文件就会变得更小 现在 当我尝试循环 XM