У меня общая проблема, когда я не нашел правильного решения. У меня есть несколько строк XML с указанным тегом c (например, MIME_SOURCE), и я не знаю, какая строка XML содержит какое значение. Но я должен заменить все вхождения.
С другой стороны, у меня есть словарь, содержащий все возможные значения XML в качестве ключа и значение, которое нужно заменить на значение. Как я уже сказал, я не знаю, что заменить, в котором XML.
Например
Часть первого XML
<MIME>
<MIME_SOURCE>\Web\Bilder Groß\1509_131_021_01.jpg</MIME_SOURCE>
</MIME>
<MIME>
<MIME_SOURCE>\Web\Bilder Groß\1509_131_021_01_MitWasserzeichen.jpg</MIME_SOURCE>
</MIME>
<MIME>
<MIME_SOURCE>\Web\Bilder Groß\icon_top.jpg</MIME_SOURCE>
</MIME>
Часть второго XML:
<MIME>
<MIME_SOURCE>\Web\Bilder klein\5478.jpg</MIME_SOURCE>
</MIME>
Словарь выглядит следующим образом:
{"\Web\Bilder Groß\1509_131_021_01.jpg", "/Web/Bilder Groß/1509_131_021_01.jpg"}
{"\Web\Bilder Groß\1509_131_021_01_MitWasserzeichen.jpg", "/Web/Bilder Groß/1509_131_021_01_MitWasserzeichen.jpg"}
{"\Web\Bilder Groß\icon_top.jpg", "icon_top.jpg"}
{"\Web\Bilder klein\5478.jpg", "5478.jpg"}
Моя главная проблема заключается в том, что, если я переберу словарь для каждой строки XML, усилия будут считаться XML строки умноженные на количество записей в словаре (n * m). В моем случае это действительно плохо, поскольку в словаре может быть около миллиона XML строк и не менее тысячи записей.
В настоящее время я использую string.Replace для каждого ключа словаря для каждого XML.
У вас есть хорошая идея, как ускорить этот процесс?
Редактировать:
Я изменил код на следующий:
var regex = new Regex(@"<MIME_SOURCE>[\s\S]*?<\/MIME_SOURCE>");
foreach (Match match in regex.Matches(stringForXml))
{
DoReplacements...
}
Это соответствует требованиям на данный момент, поскольку замена будет выполняться только для каждого MIME_SOURCE в XML. Но я также посмотрю на упомянутый алгоритм.