Linux

如何從xml中刪除標籤

  • September 3, 2020

我有以下 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 做到這一點?

您的範例不是有效的 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>

引用自:https://unix.stackexchange.com/questions/500185