0

我有一个用 BBEdit 编辑的大 XML 文件。

在 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>

我已经在 BBEdit 中使用 GREP 成功删除了其中的一些,但我开始遇到更复杂的注释标签,这些标签跨越多行或在两组不同的标签之间有文本。例如:

<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 似乎没有帮助。

我还应该说引用标签可以存在于注释标签之外,这排除了只是批量查找 /?quote 并删除它的可能性。我仍然需要在文档中使用引号标签,而不是在注释标签中。

非常感谢您的帮助。

4

2 回答 2

2

使用 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>

使用您选择的 XSLT 处理器将此样式表应用于您的 XML 文件。例如,有些工具可以在命令行上运行。

于 2010-09-10T14:14:24.613 回答
0

如果不限制 XML 的形成方式,我很确定这超出了常规语言的范围,进入了无上下文的语言,这意味着正则表达式对您没有帮助。如果 XML 的结构很简单(没有嵌套在节点中的节点或没有嵌套在引号中的引号),您可能可以按照全局替换<node>(!</node>)<quote>(!</quote>)</quote>(!</node>)</node>with的方式执行某些操作<node>\1\2\3</node>,但您可能使用了错误的工具来完成这项工作. 作为其他答案之一,XSLT 可以帮助您,或者您可以使用 XML 解析库编写一个简单的程序来去除您正在寻找的标签。

于 2010-09-10T14:25:06.480 回答