如何从xml中删除标签

如何从xml中删除标签

我有以下 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<deviceID>IO238470374109730497</devicdeID>
<KeyValuePairs>
    <KeyValuePair>
      <BASE-URL>2</BASE-URL>
      <Key>2</Key>
      <Value>2</Value>
    </KeyValuePair>
    <KeyValuePair>
     <BASE-URL>3</BASE-URL>
     <Key>3</Key>
     <Value>3</Value>
   </KeyValuePair>
</KeyValuePairs>

我只想删除这一部分:

<KeyValuePair>
    <BASE-URL>3</BASE-URL>
    <Key>3</Key>
    <Value>3</Value>
</KeyValuePair>

我想要实现的是删除里面的内容并<KeyValuePair>仅包含这些特定的<BASE-URL>,<Key><Value>。元<KeyValuePair>组总是唯一的,不会重复,但可以是一个,也可以是多个。

我怎样才能使用 bash 做到这一点?

答案1

您的示例不是有效的 XML 文件。我通过<root/>在文档周围添加一个元素(并修复结束</deviceID>标记中的拼写错误)对其进行了轻微更改:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <deviceID>IO238470374109730497</deviceID>
    <KeyValuePairs>
        <KeyValuePair>
            <BASE-URL>2</BASE-URL>
            <Key>2</Key>
            <Value>2</Value>
        </KeyValuePair>
        <KeyValuePair>
            <BASE-URL>3</BASE-URL>
            <Key>3</Key>
            <Value>3</Value>
        </KeyValuePair>
    </KeyValuePairs>
</root>

现在可以使用 XML 编辑工具来编辑 XML。此 XPath 表达式指示删除具有文本值的xmlstarletXML 元素<KeyValuePair/>(及其内容)。<BASE-URL/>3

xmlstarlet ed -d '//KeyValuePair[BASE-URL/text()="3"]' /tmp/500185.xml

输出是

<?xml version="1.0" encoding="utf-8"?>
<root>
  <deviceID>IO238470374109730497</deviceID>
  <KeyValuePairs>
    <KeyValuePair>
      <BASE-URL>2</BASE-URL>
      <Key>2</Key>
      <Value>2</Value>
    </KeyValuePair>
  </KeyValuePairs>
</root>

相关内容