我一直在嘗試修改從路徑連接 xml 檔案的腳本并將它們合并到單個 xml 中,該腳本最初用于連接文本檔案。
我有以下腳本
#!usr/bin/sh
ORIGIN_PATH="/backup/data/export/imatchISO"
HISTORY_PATH="/backup/data/batch/hist"
SEND_PATH="/backup/data/batch/output"
DATE=`date %y%m%d`
LOG="/backup/data/batch/log/concatIMatch_"$DATE
cd $ORIGIN_PATH
ls -lrt >> $LOG
cat $ORIGIN_PATH/SWIFTCAMT053_* >> $SEND_PATH/SWIFTCAMT053.XML_$DATE 2>> $LOG
mv $ORIGIN_PATH/SWIFTCAMT053_* $HISTORY_PATH >> $LOG 2>> $LOG
if [[ $(ls -A $SEND_PATH/SWIFTCAMT053.XML_$DATE) ]]; then
echo $(date " %Y-%m-%d %H:%M:%S")" - Ficheros 053 concatenados" >> $LOG
mv $SEND_PATH/SWIFTCAMT053.XML_$DATE $SEND_PATH/SWIFTCAMT053.XML 2>> $LOG
exit 0
else
echo $(date " %Y-%m-%d %H:%M:%S")" - ??ERROR CON LOS FICHEROS 053 AL CONCATENAR!" >> $LOG
exit 1
fi
我所擁有的是一個包含多個具有相同格式的xml檔案的路徑:
<?xml version="1.0" ?>
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
</DataPDU>
問題是,當我與此連接時,會將檔案的末尾附加到下一個檔案的末尾,這不是預期的結果,因為它復制了 xml 宣告標記以及所有檔案的打開<DataPDU>和關閉<DataPDU>。
我需要的是具有以下結構的單個 xml 檔案
<?xml version="1.0" ?>
<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
<ns2:Revision>2.0.13</ns2:Revision>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
<ns2:Header>
...
</ns2:Header>
<ns2:Body>
...
</ns2:Body>
</DataPDU>
所以從技術上講,我想要的是前 3 行和最后一行只出現一次。
我收到了一個提示,我可以做一些事情:
$ awk 'NR<3 {print} FNR>3 {print last} {last=$0} END{print}' *.xml
但我不明白如何為此修改我的腳本。
uj5u.com熱心網友回復:
xmllint用于正確處理 XML 檔案并從Revision第二個正文中排除 Element
body1=$(xmllint --xpath '/DataPDU/*' tmp.xml | sed -ze 's/\n/\
/g')
body2=$(xmllint --xpath '/DataPDU/*[not(local-name()="Revision")]' tmp.xml | sed -ze 's/\n/\
/g')
printf "%s\n" "cd /DataPDU" "set ${body1}${body2}" "save" "bye" | xmllint --shell tmp.xml
代碼兩次使用相同的檔案,因此相應地更改第二個檔案名。普通的新行\n被其等效
物體替換,以避免xmllintshell 上的錯誤。
awk也可以使用,但要求 XML 格式不會在檔案之間更改。
可以通過將記錄分隔符 RS 設定為來提取正文,
xmlns:ns2="urn:swift:saa:xsd:saa.2.0">或者</DataPDU>
記錄#2 包含內部元素。
# from any file
echo -e '<?xml version="1.0" ?>\n\t<DataPDU xmlns:ns2="urn:swift:saa:xsd:saa.2.0">' > output.xml
# concatenate bodies on a variable from all files
for f in *.xml; do
body =$(gawk 'BEGIN{ RS="xmlns:ns2=\"urn:swift:saa:xsd:saa.2.0\">|<[/]DataPDU>" } { if(NR == 2) { print $0 }}' "$f")
done
echo "$body" >> output.xml
# Add closing tag
echo "</DataPDU>" >> output.xml
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/516884.html
標籤:xml重击壳数据操作
