Удаление набора тегов из другого набора с использованием регулярных выражений - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть большой XML-файл, который я редактирую с помощью BBEdit.

В XML-файле, который представляет собой цифровое воссоздание старого дневника, есть текст, заключенный в теги заметок.

<note>Example of a note.</note>

Однако некоторые теги заметок содержат кавычки, вложенные в вложенные теги цитат.

<note>Example of a note, but <quote>"here is a quotation within the note"</quote></note>

Мне нужно удалить все экземпляры цитаты из тегов заметки, сохранив фактическое содержание тегов цитаты. Таким образом, пример будет:

<note>Example of a note, but "here is a quotation within the note"</note>

Я использовал GREP в BBEdit для успешного удаления некоторых из них, но я начинаю зацикливаться на более сложных тегах заметок, которые идут по нескольким строкам или имеют текст между двумя различными наборами тегов. Например:

<note>Example of a note, <quote>"with a quotation"</quote> and a <quote>"second quotation"</quote> along with some text outside of the quotation before the end of the note.</note>

Некоторые цитаты могут продолжаться более 10 строк. Использование \ r в моем регулярном выражении, похоже, не помогает.

Я должен также сказать, что теги кавычек могут существовать вне тегов заметок, что исключает возможность просто массового поиска /? Цитаты и удаления ее. Мне все еще нужно использовать теги цитат в документе, но не внутри тегов заметок.

Большое спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010

С XSLT это действительно просто:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="quote">
    <xsl:apply-templates select="node()|@*" />
  </xsl:template>
</xsl:stylesheet>

Примените эту таблицу стилей к вашему XML-файлу с выбранным вами XSLT-процессором.Есть инструменты, которые работают в командной строке, например.

0 голосов
/ 10 сентября 2010

Без ограничений на то, как формируется XML, я почти уверен, что это выходит за рамки обычных языков и на контекстно-свободные, что означает, что регулярные выражения вам не помогут.Если структура XML проста (нет узлов, вложенных в узлы, или кавычки, вложенные в кавычки), вы можете сделать что-то вроде глобальной замены <node>(!</node>)<quote>(!</quote>)</quote>(!</node>)</node> на <node>\1\2\3</node>, но вы, вероятно, используетенеправильный инструмент для работы.Как отмечает один из других ответов, XSLT может помочь вам, или вы можете использовать библиотеку синтаксического анализа XML, чтобы написать простую программу для удаления нужных тегов.

...