Как заменить часть xml с помощью xmlstarlet?

#xml #bash #shell #sh #xmlstarlet

#xml #bash #оболочка #sh #xmlstarlet

Вопрос:

Я пытаюсь заменить или поменять местами часть xml с помощью xmlstarlet. Вот пример до и после.

Перед:

 <root>
  <catalog>
    <book id="bk101">
        <author>Gambardella, Matthew</author>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
    </book>
  </catalog>

<keys>
  <key>
    <name>Robert D. Wilsey</name>
    <street>4854 Charter Street</street>
  </key>
  <key>
    <name>Elizabeth Fletcher</name>
    <street>1528 Station Street</street>
  </key>
</keys>
</root>
  

После:

 <root>
  <catalog>
    <book id="bk101">
        <author>Gambardella, Matthew</author>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
    </book>
  </catalog>

<objects>
  <object>
    <guid>55866ddd-7601-42b6-8b6b-a2adfaa01125</guid>
  </object>
</objects>
</root>
  

Скрипт:

 read -r -d '' XML <<"EOF"
<root>
  <catalog>
    <book id="bk101">
        <author>Gambardella, Matthew</author>
        <title>XML Developer's Guide</title>
        <genre>Computer</genre>
    </book>
  </catalog>

<keys>
  <key>
    <name>Robert D. Wilsey</name>
    <street>4854 Charter Street</street>
  </key>
  <key>
    <name>Elizabeth Fletcher</name>
    <street>1528 Station Street</street>
  </key>
</keys>
</root>
EOF

xmlstarlet ed -u '//rootkeys' -v "
<objects>
  <object>
    <guid>55866ddd-7601-42b6-8b6b-a2adfaa01125</guid>
  </object>
</objects>
" <<< "$XML"
  

Комментарии:

1. Ваш XML недопустим из-за двух корней (root и keys).

2. xmlstarlet не может редактировать недопустимый XML?

3. для xmlstarlet требуется действительный XML.

4. Хорошо, обновлено.