当特定子项不存在时,删除 Notepad++ 中的整个父 XML

当特定子项不存在时,删除 Notepad++ 中的整个父 XML

我有几个大型 XML 文件,其中包含以下内容:

      <TERM>
        <ACTION>ADD</ACTION>
        <TERM_CODE>1</TERM_CODE>
        <ALTERNATIVE_REPORT_CARD_FLAG>F</ALTERNATIVE_REPORT_CARD_FLAG>
        <DAYS_ABSENT>3</DAYS_ABSENT>
        <TIMES_LATE>2</TIMES_LATE>
      </TERM>

但也包含类似的块,例如:

      <TERM>
        <ACTION>ADD</ACTION>
        <TERM_CODE>2</TERM_CODE>
        <ALTERNATIVE_REPORT_CARD_FLAG>F</ALTERNATIVE_REPORT_CARD_FLAG>
        <DAYS_ABSENT>12</DAYS_ABSENT>
        <TIMES_LATE>0</TIMES_LATE>
        <SUBJECT_STRAND>
          <ACTION>ADD</ACTION>
          <SUBJECT_STRAND_CODE>ART-20</SUBJECT_STRAND_CODE>
        </SUBJECT_STRAND>
        <LEARNING_SKILL>
          <ACTION>ADD</ACTION>
          <LEARNING_SKILL_CODE>CL</LEARNING_SKILL_CODE>
          <LEVEL>ES</LEVEL>
        </LEARNING_SKILL>
      </TERM>

我想删除所有不包含该<SUBJECT_STRAND> 孩子的块。

使用 Notepad++ 中的 S/R 函数,当文件中只有上述每个块中的一个时,这似乎有效,但当同时存在多个实例时,就会失败:

<TERM>.*?</TIMES_LATE>\R[^<SUBJECT_STRAND>]+</TERM>\R

任何帮助将不胜感激!

答案1

  • Ctrl+H
  • 找什么:<TERM>(?:(?!<SUBJECT_STRAND>).)*?</TERM>
  • 用。。。来代替:LEAVE EMPTY
  • 检查匹配大小写
  • 检查环绕
  • 检查正则表达式
  • 查看. matches newline
  • Replace all

解释:

<TERM>                  # literally
                    # Tempered Greedy Token:
  (?:                   # start non capture group
    (?!                 # start negative lookahead, make sure we haven't:
      <SUBJECT_STRAND>  # literally
    )                   # end lookahead
    .                   # any character
  )*?                   # end group, may appear 0 or more times, not greedy
</TERM>                 # literally

屏幕截图(之前):

在此处输入图片描述

屏幕截图(之后):

在此处输入图片描述

相关内容