【问题标题】:Delete tags between specific tags in XML (Notepad++)删除 XML 中特定标签之间的标签 (Notepad++)
【发布时间】:2016-07-19 13:13:41
【问题描述】:

我已经使用了搜索功能,但没有找到问题的答案。

我的 XML 结构如下(示例):

<Task name="1B">
 <Person type ="XX" name="YY" height="ZZ"/>
 <Person type ="XX" name="YY" height="ZZ"/> 
 <Person type ="XX" name="YY" height="ZZ"/> 
 </Task>

 <Task name="1C">
 <Person type ="XX" name="YY" height="ZZ"/>
 <Person type ="XX" name="YY" height="ZZ"/> 
 <Person type ="XX" name="YY" height="ZZ"/> 
 </Task>

现在我想通过 Notepad++ 删除名称为“1B”的标签以及打开和关闭标签之间的所有标签。记事本有办法吗?我已经尝试过 RegEx 模式,但我没有找到正确的方法。

【问题讨论】:

  • 搜索 &lt;Task name="1B"&gt;.*?&lt;\/Task&gt; 替换为空。
  • 不起作用。在我的 XML 中找不到文本。

标签: regex xml notepad++


【解决方案1】:

强烈建议不要在 HTML 中使用正则表达式,因为这会导致许多问题和不必要的问题。见RegEx match open tags except XHTML self-contained tags使用 XSLT 转换 XML 是您真正需要的工具。

使用 remove_xml_tag.xsl 示例名称创建一个 UTF8 编码文件并将其粘贴到其中:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="Task[@name='1B']"/>
</xsl:stylesheet>

XSL 处理每个节点和属性 (node()|@*),当它遇到 Task 元素的 name 属性等于 1B ("Task[@name='1B']") 时,它只是不将其写入输出。

然后运行 ​​XML Tools 插件 -> XSL Transformation。你会看到:

单击右侧的 ... 按钮并浏览 XSL 文件。

单击变换按钮。

一种备用解决方案,以防您的 XML 格式错误,该解决方案仅在您没有嵌套的 Task 节点时才有效:

<Task\s+name="1B">[^<]*(?:<(?!/Task>)[^<]*)*</Task>

【讨论】: