Как мне обновить <path>в моем XML в соответствии с заданным именем файла - PullRequest
0 голосов
/ 04 сентября 2018
<annotation>
  <folder>cars_train</folder>
  <filename>00001.jpg</filename>
  <path>Users/hantaoliu/Documents/Research/cars_train/.jpg</path>
  <source>
    <database>Unknown</database>
  </source>
  <size>

Приведенный выше текст является файлом XML, который я хочу обновить. У меня есть 7k XML-файлов, и я хочу, чтобы их путь был:

Users/hantaoliu/Documents/Research/cars_train/$@.jpg

$@ соответствует имени входного файла. Например, если входной файл 00001.xml, я хочу, чтобы путь был:

Users/hantaoliu/Documents/Research/cars_train/00001.jpg

Я использую xmlstarlet, но я не могу понять это?

1 Ответ

0 голосов
/ 04 сентября 2018

Вы можете сделать то, что вы хотите, так. Сначала выберите значение filename и значение path.

$ filenameVal=$(xmlstarlet sel -t -v "/annotation/filename" file)
$ pathVal=$(xmlstarlet sel -t -v "/annotation/path" file)

Затем определите имя каталога path через $(dirname $pathVal) и объедините $filenameVal с ним. Вы можете выполнить тестовый прогон без редактирования файла следующим образом:

$ xmlstarlet ed -u "/annotation/path" -v "$(dirname $pathVal)/$filenameVal" file
<?xml version="1.0"?>
<annotation>
  <folder>cars_train</folder>
  <filename>00001.jpg</filename>
  <path>Users/hantaoliu/Documents/Research/cars_train/00001.jpg</path>
  <source>
    <database>Unknown</database>
  </source>
  <size>
  </size>
</annotation>

Если все выглядит хорошо, вы можете добавить переключатель -L, который говорит xmlstartlet редактировать на месте.

$ xmlstarlet ed -L -u "/annotation/path" -v "$(dirname $pathVal)/$filenameVal" file

Подтверждение результатов в file:

$ cat file
<?xml version="1.0"?>
<annotation>
  <folder>cars_train</folder>
  <filename>00001.jpg</filename>
  <path>Users/hantaoliu/Documents/Research/cars_train/00001.jpg</path>
  <source>
    <database>Unknown</database>
  </source>
  <size>
  </size>
</annotation>

Ссылки

...