【问题标题】:Fast XML (SVG) Read?快速 XML (SVG) 读取?
【发布时间】:2015-07-04 22:53:22
【问题描述】:

我有一个 XML(实际上是 SVG)文件,4000 行,大约 700 个单独的节点,每个节点都有一个重要的属性。

我想预加载数据,并用数据填充实际的 C# 运行时模型图(一些字符串拆分和属性设置)。

我使用 XmlDocument 完成了此操作,该过程耗时 12 秒(在 Unity 编辑器播放模式下)。

我开始使用XmlReader实现,只遍历文件花了6秒(没有任何处理,只有ReadMoveToNextAttribute调用)。

有什么方法可以读取文件错误... ...更快?

6-8 秒的启动时间是我无法接受的。整个过程大约需要... ...最多半秒。

【问题讨论】:

  • XmlReader 应该非常快。你能在 6 秒内发布代码吗? 4000 行也很小。
  • 是的,4000 行应该没问题。似乎使用 DOCTYPE 会导致问题。我正在解析 SVG 以获取大量的多边形数据。
  • 我也有同样的问题。第一个改进与您注意到的相同,即使用 XmlReader 而不是 XmlDocument。第二种是使用多线程,以便在不同的线程中处理一级节点(与计算机上的核心一样多的线程)..
  • XML 文件的大小(以千字节为单位)是多少?
  • 好像是DOCTYPE的定义,我把它作为答案放在下面。

标签: c# xml unity3d xml-parsing


【解决方案1】:

我只是从文件本身中删除了DOCTYPE 定义。

即使使用原始的XmlDocument 实现,它将性能提升 8 倍

<!-- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -->

【讨论】:

  • 也许我也可以使用XmlDocument 实现?去看看。
  • 我明白了。这引用了一个外部 DTD。很可能正在下载这需要时间。有信息here
  • 我检查了我的应用程序加载的一些 Xml 文件。它们没有 DOCTYPE,并在几秒钟内加载,大小为 20 Mb。
  • 现在需要1.06 秒而不是7.8 全部使用XmlDocument。该文件是334 Kb。我正在考虑延迟解析叶节点,仅在它们真正需要时。
  • 不预先解析实际的多边形会节省另一个 0.6 秒。其实是
【解决方案2】:

或者,您可以使用设置参数绕过 DTD 验证:

// Files with a <!DOCTYPE ...> get parsed with a super expensive validation; ignore it.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.None;
settings.XmlResolver = null;
settings.DtdProcessing = DtdProcessing.Ignore;

XmlReader reader = XmlReader.Create(filePath, settings);
XmlDocument doc = new XmlDocument();
doc.Load(reader);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多