
我想以程式設計方式更新一個非常簡單的 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。awk
sed
2xml
對於你的例子,如果我拿這個文件:
<?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>
……文法上是正確的,但更難閱讀。