Как выбрать и отредактировать узел XML с помощью xmlstartlet? - PullRequest
4 голосов
/ 08 апреля 2011

Здесь я выбираю узел:

$ xmlstarlet sel -t -c "/configuration/property[name='http.agent.name']"/value conf/nutch-default.xml 
<value/>

Это не редактирует его:

$ xmlstarlet edit  "/configuration/property[name='http.agent.name']"/value -v 'test' conf/nutch-default.xml 
I/O warning : failed to load external entity "/configuration/property[name='http.agent.name']/value"

Какой будет команда xmlstartlet, которая изменит изменение?AFAIK -x пока не поддерживается в xmlstartlet.

Я работаю над conf / nutch-default.xml

$ xmlstarlet ed --help
XMLStarlet Toolkit: Edit XML document(s)
Usage: xml ed <global-options> {<action>} [ <xml-file-or-uri> ... ]
where
  <global-options>  - global options for editing
  <xml-file-or-uri> - input XML document file name/uri (stdin otherwise)

<global-options> are:
  -P (or --pf)        - preserve original formatting
  -S (or --ps)        - preserve non-significant spaces
  -O (or --omit-decl) - omit XML declaration (<?xml ...?>)
  -N <name>=<value>   - predefine namespaces (name without 'xmlns:')
                        ex: xsql=urn:oracle-xsql
                        Multiple -N options are allowed.
                        -N options must be last global options.
  --help or -h        - display help

where <action>
  -d or --delete <xpath>
  -i or --insert <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
  -a or --append <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
  -s or --subnode <xpath> -t (--type) elem|text|attr -n <name> -v (--value) <value>
  -m or --move <xpath1> <xpath2>
  -r or --rename <xpath1> -v <new-name>
  -u or --update <xpath> -v (--value) <value>
             -x (--expr) <xpath> (-x is not implemented yet)

XMLStarlet is a command line toolkit to query/edit/check/transform
XML documents (for more information see http://xmlstar.sourceforge.net/)

$ xmlstarlet --version
1.0.1

Ответы [ 3 ]

5 голосов
/ 08 апреля 2011

Вы можете прочитать все содержимое файла nutch-default.xml в переменную, отредактировать содержимое этой переменной с помощью xmlstarlet и затем снова записать результат обратно в файл nutch-default.xml.

Другой способ - использовать дескрипторы открытых файлов, как описано в Перенаправить вывод из sed 's / c / d /' myFile в myFile .

xmlstarlet --version  # 1.0.6
xmlstarlet ed --help | less -Ip 'inplace'

# 1.
# in-place version using xmlstarlet only
curl -L -s -o nutch-default.xml 'http://svn.apache.org/viewvc/nutch/branches/branch-1.3/conf/nutch-default.xml?view=co&revision=1079746&content-type=text%2Fplain'
xmlstarlet edit -L -u "/configuration/property[name='http.agent.name']"/value -v 'test' nutch-default.xml
xmlstarlet sel -t -c "/configuration/property[name='http.agent.name']"/value nutch-default.xml 


# 2.
# variable version
curl -L -s -o nutch-default.xml 'http://svn.apache.org/viewvc/nutch/branches/branch-1.3/conf/nutch-default.xml?view=co&revision=1079746&content-type=text%2Fplain'
xmlstr="$(< nutch-default.xml)"   # save file contents to variable

printf '%s\n' "$xmlstr" |
xmlstarlet edit -u "/configuration/property[name='http.agent.name']"/value -v 'test' > nutch-default.xml

xmlstarlet sel -t -c "/configuration/property[name='http.agent.name']"/value nutch-default.xml 


# 3.
# file handle version
# cf. /2176758/perenapravit-vyvod-iz-sed-s-c-d-myfile-v-myfile
curl -L -s -o nutch-default.xml 'http://svn.apache.org/viewvc/nutch/branches/branch-1.3/conf/nutch-default.xml?view=co&revision=1079746&content-type=text%2Fplain'
exec 3<nutch-default.xml
rm nutch-default.xml   # prevent open file from being truncated
xmlstarlet edit -u "/configuration/property[name='http.agent.name']"/value -v 'test' <&3 >nutch-default.xml
xmlstarlet sel -t -c "/configuration/property[name='http.agent.name']"/value nutch-default.xml 
4 голосов
/ 14 июня 2016

Документация очень очень плохая. Я наткнулся на Stackoverflow более чем на один день, и после прочтения многих ответов о переполнении стека, я наконец-то нашел решение для «опции редактирования файла на месте» для значения элемента с определенными пространствами имен. Учитывая XML, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <cassandra xmlns="http://venus.com/ns/mibs/VENUS-MODE/1.0">
    <clusterName>test-cluster</clusterName>
    <cassandraUsername>simba</cassandraUsername>
    <cassandraPassword>U2FsdGVkX1/Zc4NAsF59coYZLaCgddJ9b91s016HUbs=</cassandraPassword>
    <cassandraService>Local</cassandraService>
  </cassandra>
  <monit xmlns="http://venus.com/ns/mibs/VENUS-MODE/1.0">
    <cpuUsageThreshold>70</cpuUsageThreshold>
    <cpuUsageThresholdClear>60</cpuUsageThresholdClear>
    <memoryUsageThreshold>70</memoryUsageThreshold>
    <memoryUsageThresholdClear>60</memoryUsageThresholdClear>
  </monit>
</config>

Команда xmlstarlet для изменения значения элемента / config / cassandra / clusterName будет иметь следующий вид:

xmlstarlet ed -L -N x = "http://venus.com/ns/mibs/VENUS-MODE/1.0" -u "// config / x: cassandra / x: cassandraPassword" -v "test123" Myfile.xml

Помните, что опция ed & -L должна предшествовать опции -N (namespace). Надеюсь, что это поможет кому-то найти вариант редактирования файла вместо проблем с пространством имен.

1 голос
/ 08 апреля 2011

Моя версия xmlstarlet нуждается в опции action для команды edit.Если вы хотите обновить узел новым значением, вы должны указать -u, например:

xmlstarlet edit -u "/configuration/property[name='http.agent.name']"/value -v 'test' conf/nutch-default.xml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...