我們有一個相當復雜的 zsh 應用程式,它使用 XML 檔案來存盤其配置和資料。當前讀取和寫入這些檔案的方法是使用xmlstarlet。
更新檔案時,我們多次通過管道傳輸整個 XML,對于我們觸摸的每個屬性或元素一次,如下所示:
cat "$config" \
| xml_addSubnode "/a/b/c" "foo" \
| xml_createOrUpdateAttribute "/a/b/c/foo[last()]" "attr1" "zzzz" \
| xml_createOrUpdateAttribute "/a/b/c/foo[last()]" "attr2" "wwww" \
\
| xml_addSubnode "/a/b/c/foo[last()]" "attr3" \
| xml_createOrUpdateAttribute "/a/b/c/foo[last()]/bar" "attr4" "zzzz" \
| xml_createOrUpdateAttribute "/a/b/c/foo[last()]/bar" "attr5" "kkkk" \
\
| xml_update "$config"
通過xml每次分別呼叫,在 shell 變數中讀取屬性:
local foo="$(xml_value "$xpath" "$config")"
local bar="$(xml_value "$xpath" "$config")"
...
效用函式歸結為以下幾點:
xml_addSubnode() {
...
cat | xml ed -s "$elementXPath" -t elem -n "$element"
}
xml_createOrUpdateAttribute()
{
...
cat | xml ed --update ... --insert ...
}
xml_value()
{
...
xml sel -t -v "$xPath" "$xmlFile"
}
xml_update()
{
...
cat > "$file"
}
這段代碼在功能上運行良好,但顯然性能很差。
如何使這段代碼高效?還有哪些其他方法可以使用 zsh 或 bash 決議 XML 以加快執行速度?
使用另一種格式也是一種選擇,盡管它需要一些遷移作業。我知道jqJSON 決議器,但用法類似于,xmlstarlet如果我遵循相同的方法,我不會獲得太多收益,對嗎?
該程式在 FreeBSD 上運行。
uj5u.com熱心網友回復:
您可以使用 一次性完成所有更新xmlstarlet,這比呼叫 6 次要快得多:
#!/usr/bin/env zsh
cat test.xml
print -- --------
xmlstarlet ed \
-s '/a/b/c' -t elem -n foo \
-s '/a/b/c/foo[last()]' -t attr -n attr1 -v zzzz \
-s '/a/b/c/foo[last()]' -t attr -n attr2 -v wwww \
-s '/a/b/c/foo[last()]' -t elem -n bar \
-s '/a/b/c/foo[last()]/bar' -t attr -n attr3 -v zzzz \
-s '/a/b/c/foo[last()]/bar' -t attr -n attr4 -v kkkk \
test.xml
例子:
$ ./test.sh
<?xml version="1.0"?>
<a><b><c/></b></a>
--------
<?xml version="1.0"?>
<a>
<b>
<c>
<foo attr1="zzzz" attr2="wwww">
<bar attr3="zzzz" attr4="kkkk"/>
</foo>
</c>
</b>
</a>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376538.html
標籤:xml 表现 贝壳 zsh xmlstarlet
上一篇:使用awk插入行
