如何有效地编辑大文件 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?的主要内容,如果未能解决你的问题,请参考以下文章