删除XML中特定标记之间的标记(Notepad ++)

时间:2016-07-19 13:13:42

标签: regex xml notepad++

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

我有一个类似于以下(示例)的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 ++删除带有Name&#34; 1B&#34;的标签。以及打开和结束标记之间的所有标记。记事本有办法吗?我已经尝试过使用RegEx Pattern,但我没有找到正确的方法。

1 个答案:

答案 0 :(得分: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工具插件 - &gt; XSL转换。你会看到:

enter image description here

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

单击转换按钮。

如果您的XML格式错误,只有在没有嵌套的Task节点时才能使用的回退解决方案:

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