我有以下 xml 檔案:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:aut="http://">
<soapenv:Header>
<aut:Session>
<aut:IPAddress>127.0.0.1</aut:IPAddress>
<aut:SessionToken>true</aut:SessionToken>
<aut:ApplicationToken>861</aut:ApplicationToken>
</aut:Session>
</soapenv:Header>
<soapenv:Body></soapenv:Body>
</soapenv:Envelope>
<aut:SessionToken>true</aut:SessionToken>替換為
的最佳方法是<aut:SessionToken>false</aut:SessionToken>什么?
這是我正在嘗試的:
xmllint --shell file.xml << EOF
cd //*[local-name() = "Header"]/*[local-name() = "Session"]/text()/*[local-name() = "SessionToken"]/text()
set failed
save
EOF
當我嘗試將 true 替換為 false 時,由于命名空間而出現問題。
博士,法學博士
uj5u.com熱心網友回復:
在處理 SOAP 信封時,我不會使用*[local-name() = "…"]
忽略名稱空間的方法。相反,使用顯式命名空間系結。
例如,切換布林值
xmlstarlet edit -N aut="http://" \
--var T '//aut:Session/aut:SessionToken' \
-u '$T' -x 'not($T)' file.xml
添加-L/--inplace之前-N就地編輯檔案。
要讀取它的值:
xmlstarlet select -N aut="http://" \
-t -v '//aut:Session/aut:SessionToken' -n file.xml
uj5u.com熱心網友回復:
你快到了。你只是在那里有一個額外的text()元素。在 xmlstartlet 中,嘗試
xml ed -u '//*[local-name() = "Header"]/*[local-name() = "Session"] \
//*[local-name() = "SessionToken"]//text()' -v "false" yourfile.xml
uj5u.com熱心網友回復:
你的方法xmllint離正確不遠。只需要在 XPath 運算式中添加命名空間處理和使用命名空間前綴。
setrootns
cd //soapenv:Header/aut:Session/aut:SessionToken
set failed
save
作為一個單行:
echo -e "setrootns\n cd //soapenv:Header/aut:Session/aut:SessionToken\n set failed\n save\n bye" | xmllint --shell test.xml
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/436474.html
標籤:xml 重击 解析 xmlstarlet xmllint
