我有以下 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 表达式指示删除具有文本值的xmlstarlet
XML 元素<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>