簡體   English   中英

如何將 xmlstarlet 輸出與 nul 分開?

[英]How do I separate xmlstarlet output with nul?

我正在嘗試使用 nul (U+0) 來分隔 xmlstarlet 輸出中的 xml 值。 xmlstarlet忽略-o ''-o $'\\0'-o '\\0'

我知道我可以使用其他字符(如各種字段分隔符)來分隔輸出。 這種方法的問題在於這些字符也可以作為數據存在。 我不想有任何歧義。

我想特別使用 nul,因為它是唯一不能用原始 XML 表示的值。

所以,重復我的問題:如何將 xmlstarlet 輸出與 nul 分開?

更多信息

應請求者的要求,我已包含以下信息。 雖然我很感激您提供幫助的願望,但請避免建議XY 解決方案 我只是在尋找我提出的問題的答案。

我正在處理的數據如下所示:

<data>
    <datapoint attribute-1="val-1" attribute-2="val-a" />
    <datapoint attribute-1="val-2" attribute-2="val-b"  />
    <datapoint attribute-1="val-3">
        <sub-datapoint />
    </datapoint>
</data>

我嘗試使用 xmlstarlet 的方式:

mapfile -tf ARRAY < <( xmlstarlet sel -t -m /data/datapoint -o 'datapoint' -o $'\0' -v ./@attribute-1 -o $'\0' data.xml )

我正在尋找的輸出的十六進制轉儲:

64 61 74 61 70 6f 69 6e  74 00 76 61 6c 2d 31 00  |datapoint.val-1.|
64 61 74 61 70 6f 69 6e  74 00 76 61 6c 2d 32 00  |datapoint.val-2.|
64 61 74 61 70 6f 69 6e  74 00 76 61 6c 2d 33 00  |datapoint.val-3.|

不幸的是, xmlstarlet似乎無法在其輸出中生成 nul。

然而xmlstarlet能夠產生U+FFFF 在所有 XML 版本中都無效的代碼點。 您可以使用此代碼安全地分隔 XML 值,然后使用另一個程序將其替換為 nul:

xmlstarlet sel -t \
   -m /data/datapoint \
   -o 'datapoint' \
   -o $'\uffff' \
   -v ./@attribute-1 \
   -o $'\uffff' data.xml \
 | python3 -c 'import sys; 
               sys.stdout.write(sys.stdin.read().replace("\uffff", "\0"))'

您可以使用$'\\1'在大多數情況下應該與 null 一樣好:

mapfile -d $'\1' -t ARRAY < <( xmlstarlet sel -t -m "XPATH" -v "XPATH" -o $'\1' -v 'XPATH' "FILE" )

這是@TendersMcChiken 答案的變體,用 perl 代替了 python:

xmlstarlet sel -t -m /data/datapoint \
  -o 'datapoint' -o $'\uffff' -v ./@attribute-1 -o $'\uffff' data.xml \ 
  | perl -C -0xFFFF -l0 -pe '' \
  | hexdump -e '16/1 "%-3.2x"' -e '"|" 16/1 "%_p" "|\n"'

結果與問題中顯示的 hexdump 輸出匹配。

順便說一句,既然目標是結果捕捉到一個bash數組,我不知道為什么這次沒工作:

mapfile -d $'\uffff' -t arr < <(
  xmlstarlet sel -t -m /data/datapoint \
  -o 'datapoint' -o $'\uffff' -v ./@attribute-1 -o $'\uffff' data.xml
)

這不起作用的原因是 bash 當前不支持多字節字符作為內置mapfile的分隔符。 [ 來源]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM