当前位置:  开发笔记 > 编程语言 > 正文

在C#中以编程方式检查XML文件格式良好的最快方法是什么?

如何解决《在C#中以编程方式检查XML文件格式良好的最快方法是什么?》经验,为你挑选了1个好方法。

我有大批手动更新的XHTML文件.在更新的审查阶段,我想以编程方式检查文件的格式.我目前正在使用XmlReader,但平均CPU所需的时间比我预期的要长得多.

XHTML文件的大小范围为4KB到40KB,每个文件的验证需要几秒钟.检查是必不可少的,但我希望尽可能缩短时间,因为在将文件读入下一个流程步骤时执行检查.

有没有更快的方法来进行简单的XML格式检查?也许使用外部XML库?


我可以确认使用XmlReader验证"常规"基于XML的内容是快速的,并且正如所建议的那样,问题似乎与每次验证文件时读取XHTML DTD的事实有关.


请注意,除了DTD之外,还会下载相应的.ent文件(xhtml-lat1.ent,xhtml-symbol.ent,xhtml-special.ent).

由于完全忽略DTD并不是XHTML的真正选择,因为良好的格式与允许的HTML实体紧密相关(例如,当我们忽略DTD时,会立即引入验证错误).


通过使用建议的自定义XmlResolver,结合DTD和实体文件的本地(嵌入)副本,解决了该问题.

一旦我清理了代码,我就会在这里发布解决方案



1> Marc Gravell..:

我期望XmlReaderwhile(reader.Read)() {}将是最快的管理办法.读取40KB 肯定不需要几秒钟 ......您使用的输入方法是什么?

你可能有一些外部(架构等)实体要解决?如果是这样,您可能能够编写使用本地缓存模式而不是远程获取的自定义XmlResolver(set via XmlReaderSettings)...

以下几乎立即执行~300KB:

    using(MemoryStream ms = new MemoryStream()) {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.CloseOutput = false;
        using (XmlWriter writer = XmlWriter.Create(ms, settings))
        {
            writer.WriteStartElement("xml");
            for (int i = 0; i < 15000; i++)
            {
                writer.WriteElementString("value", i.ToString());
            }
            writer.WriteEndElement();
        }
        Console.WriteLine(ms.Length + " bytes");
        ms.Position = 0;
        int nodes = 0;
        Stopwatch watch = Stopwatch.StartNew();
        using (XmlReader reader = XmlReader.Create(ms))
        {
            while (reader.Read()) { nodes++; }
        }
        watch.Stop();
        Console.WriteLine("{0} nodes in {1}ms", nodes,
            watch.ElapsedMilliseconds);
    }

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有