从KML文件中删除匹配的嵌套元素标签

发布于 2025-01-27 21:51:33 字数 690 浏览 4 评论 0原文

我正在尝试使用简单的bash/sed代码从kml文件中删除代码的以下部分。

我熟悉使用sed删除XML标签,但是,我不确定如何删除与某些名称匹配的子标签。

要重新入学,我需要匹配,然后删除整个“覆盖” < folder></folder>从kml文件中的标签。

尝试解析所需模式匹配的bash代码:

grep -B 1 "<name>Overlay</name>" -A 9

kml代码:

<Folder>
  <name>Overlay</name>
  <open>0</open>
  <Style>
    <ListStyle>
    <listItemType>check</listItemType>
    <bgColor>00ffffff</bgColor>
    <maxSnippetLines>2</maxSnippetLines>
    </ListStyle>
  </Style>
</Folder>

I am trying to remove the below section of code from a KML file, ideally using simple Bash/sed code.

I am familiar with removing XML tags using sed but, I'm not sure how to remove sub-tags matching certain names.

To re-iterate, I need to match and then remove the entire "Overlay" <Folder></Folder> tag from the KML file.

Attempted Bash Code for Parsing Desired Pattern Match:

grep -B 1 "<name>Overlay</name>" -A 9

KML Code:

<Folder>
  <name>Overlay</name>
  <open>0</open>
  <Style>
    <ListStyle>
    <listItemType>check</listItemType>
    <bgColor>00ffffff</bgColor>
    <maxSnippetLines>2</maxSnippetLines>
    </ListStyle>
  </Style>
</Folder>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

○闲身 2025-02-03 21:51:33

这可能对您有用(gnu sed):

sed '/<Folder>/{:a;N;/<\/Folder>/!ba;/<name>Overlay<\/name>/d}' file

收集从&lt; folder&gt;&lt;/folder&gt;的范围内的行,如果该集合包含&lt ; name&gt; oferlay&lt;/name&gt;删除它。

This might work for you (GNU sed):

sed '/<Folder>/{:a;N;/<\/Folder>/!ba;/<name>Overlay<\/name>/d}' file

Gather up lines in the range from <Folder> to </Folder> and if the collection contains <name>Overlay</name> delete it.

方觉久 2025-02-03 21:51:33

建议一行gawk(在大多数Linux计算机中,常规 awk )脚本:

  gawk '/<Folder>/,/<\/Folder>/{next}1' input.kml

Suggesting one line gawk (normal awk in most Linux machines) script:

  gawk '/<Folder>/,/<\/Folder>/{next}1' input.kml
浅忆流年 2025-02-03 21:51:33

yq 可以用于您的任务。

它是YAML处理器,也可以处理XML。
该语法类似于 jq

据我正确理解您,您想删除所有元素,包括它的子数据,
具有子元素&lt; name&gt; ='覆盖'
无论嵌套深度如何,以下代码都可以执行此操作。

name =覆盖YQ-Input-Format XML-Output-format XML E'del(.. | select(type ==“ !! MAP”)| select(.name == env(name))) '$ inputfile

输入

<root>
  <Folder>
    <name>Data 1</name>
  </Folder>
  <Folder>
    <name>Overlay</name>
    <open>0</open>
    <Style>
      <ListStyle>
      <listItemType>check</listItemType>
      <bgColor>00ffffff</bgColor>
      <maxSnippetLines>2</maxSnippetLines>
      </ListStyle>
    </Style>
  </Folder>
  <Folder>
    <name>Data 2</name>
  </Folder>
</root>

输出

<root>
  <Folder>
    <name>Data 1</name>
  </Folder>
  <Folder>
    <name>Data 2</name>
  </Folder>
</root>

yq can be used for your task.

It is a YAML processor and can also deal with XML.
The syntax is similar to jq.

As far as I have understood you correctly, you want to delete all elements including it's child data,
that have as child element <name> = 'Overlay'.
The following code does this regardless of the nesting depth.

NAME=Overlay yq --input-format xml --output-format xml e 'del(.. | select(type == "!!map") | select(.name == env(NAME)))' $INPUTFILE

Input

<root>
  <Folder>
    <name>Data 1</name>
  </Folder>
  <Folder>
    <name>Overlay</name>
    <open>0</open>
    <Style>
      <ListStyle>
      <listItemType>check</listItemType>
      <bgColor>00ffffff</bgColor>
      <maxSnippetLines>2</maxSnippetLines>
      </ListStyle>
    </Style>
  </Folder>
  <Folder>
    <name>Data 2</name>
  </Folder>
</root>

Output

<root>
  <Folder>
    <name>Data 1</name>
  </Folder>
  <Folder>
    <name>Data 2</name>
  </Folder>
</root>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文