Как заменить N-й элемент в XML-файле с помощью Notepad ++? - PullRequest
1 голос
/ 14 сентября 2011

Пример XML

<animal>
    <dog>rex</dog>
    <dog>rex</dog>
    <dog>rex</dog>
</animal>

Используя Notpad ++, есть ли способ заменить значение элемента 3-й собаки. По сути, я хочу найти 3-го ребенка животного и заменить значение.

У меня такое ощущение, что это может быть невозможно, и что мне придется написать какой-то сценарий, чтобы добиться этого. Но всегда стоит спросить.

Дополнительные сведения, если вы заинтересованы.

У меня есть сотни XML-документов, в которых я должен заменить значение для 3-го, 4-го и 5-го дочерних элементов. Я ищу самый простой способ сделать это. Многие в офисе используют notepad ++, поэтому, если бы было решение с использованием notepad ++, это было бы идеально.

1 Ответ

3 голосов
/ 15 сентября 2011

С Notepad ++ связано то, что он изначально не поддерживает многострочные регулярные выражения .

Изменить 08.11.2012 : вышесказанное больше не относится к Notepad ++ 6.0.Но это верно для 5.x.

Для замены текста, он имеет нормальный режим, расширенный режим и режим регулярных выражений, в котором отсутствуют некоторые вещи.Однако два последних можно объединить для получения хороших результатов (на самом деле, иногда даже проще разделить обработку на несколько частей).

Непонятное решение, но работающее:

Launch Search -> Find in files (CTRL-SHIFT-F), укажите каталог и фильтры, а затем:

  • избавьтесь от любых пробелов (пробелы, отступы табуляции) и новых строк - замените, используя Режим поиска = расширенный ,последовательно: найдите то, что = \r\n, \t, <single space here>, замените на = <leave the field empty> в каждом случае.После этого у вас есть однострочный текст, который нравится N ++ для обработки регулярных выражений:
  • теперь выполняйте ваши операции в Режим поиска = Регулярное выражение :
    • Найдите что= <animal><dog>(.*?)</dog><dog>(.*?)</dog><dog>(.*?)</dog><dog>(.*?)</dog><dog>(.*?)</dog></animal>
    • Заменить на = <animal><dog>\1</dog><dog>\2</dog><dog>\3aaa</dog><dog>\4bbb</dog><dog>\5ccc</dog></animal>
  • TextFX -> TextFX HTML Tidy -> Tidy: переопределить XML для получения форматирования XMLназад (может незначительно отличаться по количеству пробелов и т. д.).

На шагах 1 и 2 нажмите «Заменить в файлах» для выполнения.

Строки \1 ,..., \5 относятся к значениям последовательных узлов (значения в скобках в регулярном выражении).Поместите это или оставьте это и добавьте любой произвольный текст, который вы хотите.(.*?) - это регулярное выражение, которое соответствует любому символу и является нечувствительным (? обозначает несжатость), поэтому оно будет соответствовать только кратчайшему возможному фрагменту (в противном случае он мог бы найти меньшее число <animal> s, чем у вас в файлах.

...