用於更新簡單 XML 檔案的 CLI 命令

用於更新簡單 XML 檔案的 CLI 命令

我想以程式設計方式更新一個非常簡單的 XML 設定檔中的字串,如下所示:

<?xml version="1.0"?>
<x>
    <z>should be changed</z>
</x>
<y>
    <z>should NOT be changed</z>
</y>

是否存在一個簡單的 CLI 指令可以更新 x/z 而不是 y/z ?也許帶有 XPath 選擇器參數,例如:

$ xml-update myfile.xml /x/z "my new string"

我可以用 Perl 或 Python 寫一些東西,但考慮到這個問題的簡單性,我想一定有一個聰明的 Unix 實用程式已經可以做到這一點。

更新: 我發現了這個,但似乎有點過分了。我必須先學習 XSLT。http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/

答案1

您可以使用xml2/2xml無需太多麻煩即可在命令列上處理 XML 的工具。 將 XML 文件轉換為適合與傳統文字處理工具(如或 )xml2一起使用的面向行的格式,並採用此格式並將其轉換回 XML。awksed2xml

對於你的例子,如果我拿這個文件:

<?xml version="1.0"?>
<doc>
<x>
    <z>should be changed</z>
</x>
<y>
    <z>should NOT be changed</z>
</y>
</doc>

運行xml2該內容會產生:

$ xml2 < doc.xml
/doc/x/z=should be changed
/doc/y/z=should NOT be changed

<z>我可以這樣修改元素的內容

xml2 < doc.xml |
sed '/\/doc\/x\/z/ s/should be changed/look ma no hands/' |
2xml | tidyp -xml -i -q

我使用sed搜尋表達式明確查找以 開頭的行/doc/y/z,然後修改該行的內容,這給了我們:

<doc>
  <x>
    <z>look ma no hands</z>
  </x>
  <y>
    <z>should NOT be changed</z>
  </y>
</doc>

我透過 XML 格式化程式傳遞輸出tidyp,因為否則文件將如下所示:

<doc><x><z>look ma no hands</z></x><y><z>should NOT be changed</z></y></doc>

……文法上是正確的,但更難閱讀。

相關內容