如何有效地编辑大文件 XML?

Posted

技术标签:

【中文标题】如何有效地编辑大文件 XML?【英文标题】:How to edit big file XML efficiently? 【发布时间】:2021-12-10 18:30:40 【问题描述】:

所以基本上我有一个超过 300,000 行的大型 XML 文件。它看起来像这样:

<TextField>
    <ID>41445</ID>
    <Text>Passing over</Text>
</TextField>
<TextField>
    <ID>1123</ID>
    <Text>Press ESC to get back into the menu</Text>
</TextField>

我制作了一个控制台程序来使用xmlDocument 读取文件并迭代每个节点以翻译文本:

foreach (XmlNode item in nodeList)

    if (item.SelectSingleNode("Text") != null)
    
         if (!re.IsMatch(item["Text"].InnerText)) //check if text is empty or number only
              item["Text"].InnerText = translate(item["Text"].InnerText, "en", "fr"); //trans from 1 to 2
    

基本上,翻译方法需要 0.5-1 秒才能完成,所以对于有这么多行的文件,在我的情况下,它超过 300,000,这可能需要我很长时间才能完成该文件的翻译。你有没有更好的方法来更快地做到这一点?我正在考虑将节点分成小部分,让每个线程分别完成工作。但我真的不知道该怎么做。谢谢。

【问题讨论】:

为什么翻译这么久? @CodeCaster 好吧,我正在使用 Yandex translate api 来完成翻译工作,我需要花费大量时间来返回翻译后的文本。可能只是由于远离他们的服务器而造成的延迟。 你可以拆分你的xml文件并使用Task翻译那些,我认为它会是第一个...... 据我所知,您在每次循环迭代时都请求翻译 API。这意味着应该完成许多请求响应。如何将每个InnerText 值转换为字符串列表,然后请求翻译API 将所有字符串翻译为一个文本(你好string.Join)。然后在响应时将翻译后的文本拆分为单独的字符串并设置回节点? 【参考方案1】:

使用 XML Linq 非常快。尝试以下:

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

namespace ConsoleApplication4

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

            Dictionary<string, string> dict = doc.Descendants("TextField")
                .GroupBy(x => (string)x.Element("ID"), y => (string)y.Element("Text"))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
        
    

【讨论】:

以上是关于如何有效地编辑大文件 XML?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地测试使用 Behat/Mink 访问大文件?

如何使用 Go 有效地下载大文件?

如何有效地读取非常大的 gzip 压缩日志文件的最后一行?

如何有效处理大文件中间的插入或删除?

如何在hadoop map reduce作业中有效地缓存大文件?

有效地读取巨大的 csv 文件?