2015-11-30 8 views
0

Мне очень хотелось бы, чтобы XML правильно писал, но файл приходит к нам от третьего лица, у которого нет контроля над , (Они другой поставщик нашего клиента)C# Цитирование через каталог, поиск XML в каждом каталоге и, если & present заменить на & - Сохранить

Так с этим в виде: Они посылают нам почтовый индекс папок и вложенных папки (в каждом из вложенных папок там будет XML) XML, который они посылают у нас есть & вместо & amp (каждый & такой, но не каждый XML будет иметь &); Используя мой код, я могу (на консоли, по крайней мере) цикл по каждому из подлодки, найти XML, найти строку с & (если есть) и изменить его на &

foreach (string d in Directory.GetFiles(targetDirectory, "*.xml", SearchOption.AllDirectories)) 
      { 
       Console.WriteLine(d); 
       String[] lines = File.ReadAllLines(d); 
       for (int i = 0; i < lines.Length; i++) 
       { 
        if (lines[i].Contains("&")) 
        { 
         string line = lines[i]; 
         line = line.Replace("&", "&amp;"); 
         Console.WriteLine(line); 

        } 

       } 
      } 

В последнем "еЫп (линия);" он показывает, что & изменен (по крайней мере, в памяти), но когда я использую «System.IO.File», если все еще заполняется оригиналом &.

+3

Вы пишете оригинальные строки перейдите в новый файл. Попробуйте 'lines [i] = line.Replace ...'. Существуют и другие проблемы с вашим кодом, например, тот факт, что вы повторяете все строки в файле на каждой итерации цикла. – Joe

+0

Спасибо Joe, System.IO.File.WriteAllLines (d, lines); был ошибочным. Я удалил его там – user001

ответ

1
foreach (string d in Directory.GetFiles(targetDirectory, "*.xml", SearchOption.AllDirectories)) 
{ 
    String[] lines = File.ReadAllLines(d); 
    for (int i = 0; i < lines.Length; i++) 
    { 
     if (lines[i].Contains("&")) 
     { 
      lines[i] = lines[i].Replace("&", "&amp;");        
     } 
    } 
    System.IO.File.WriteAllLines(d, lines); 
} 

Как отметил Joe в комментариях, ваш оригинальный код записывался в файл во время цикла над строками в файле. Я также заменил жесткий кодированный путь к файлу в File.WriteAllLines() к переменному Еогеаспу

+0

Я, очевидно, не знал, что вы можете «lines [i] = lines [i] .Replace». Отлично – user001

2

Чтобы сэкономить время печатания, вместо этого цикла, сделать что-то вроде:

lines = lines.Select(x => x.Replace("&", "&amp")).ToArray();