0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

xmlstarletの利用例

Posted at

xmlstarletを使いXMLの読み書きをしたので使用例を残す。

名前空間を使用

サンプルスクリプト

sample.sh
#!/bin/sh

#	set -n								# Check for syntax errors
#	set -x								# Show command and argument expansion
#	set -o ignoreeof					# Do not exit with Ctrl+D
#	set +m								# Disable job control
	set -e								# End with status other than 0
	set -u								# End with undefined variable reference
#	set -o pipefail						# End with in pipe error

#	trap 'exit 1' SIGHUP SIGINT SIGQUIT SIGTERM

	_DIRS_SKEL="./etc/skel"
	_DIRS_XDGS="/etc/xdg"

	_FILE_PATH="openbox/lxde-rc.xml"
	_XDGS_PATH="${_DIRS_XDGS}/openbox/LXDE/rc.xml"
	_CONF_PATH="${_DIRS_SKEL}/.config/${_FILE_PATH}"
	if [ -f "${_XDGS_PATH}" ]; then
		mkdir -p "${_CONF_PATH%/*}"
		cp "${_XDGS_PATH}" "${_CONF_PATH}"
		# --- edit xml file ---------------------------------------------------
		_NAME_SPCE="http://openbox.org/3.4/rc"
		_XMLS_PATH="//N:openbox_config/N:theme"
		# --- update ------------------------------------------------------------------
		COUNT="$(xmlstarlet sel -N N="${_NAME_SPCE}" -t -m "${_XMLS_PATH}" -v "count(N:font)" "${_CONF_PATH}")"
		: $((I=1))
		while [ $((I<=COUNT)) -ne 0 ]
		do
			_NAME="$(xmlstarlet sel   -N N="${_NAME_SPCE}" -t -m "${_XMLS_PATH}/N:font[${I}]"        -v "N:name"  "${_CONF_PATH}" |  sed -e 's/^\(.\)\(.*\)$/\U\1\L\2/g' || true)"
		#	_SIZE="$(xmlstarlet sel   -N N="${_NAME_SPCE}" -t -m "${_XMLS_PATH}/N:font[${I}]"        -v "N:size"  "${_CONF_PATH}" || true)"
			         xmlstarlet ed -L -N N="${_NAME_SPCE}"    -u "${_XMLS_PATH}/N:font[${I}]/N:name" -v "${_NAME}"                        \
			                                                  -u "${_XMLS_PATH}/N:font[${I}]/N:size" -v "9"       "${_CONF_PATH}" || true
			I=$((I+1))
		done
		xmlstarlet ed -L -N N="${_NAME_SPCE}" -u "${_XMLS_PATH}/N:name" -v "Clearlooks-3.4" "${_CONF_PATH}" || true
		# --- append ------------------------------------------------------------------
		xmlstarlet ed -L -N N="${_NAME_SPCE}" -s "${_XMLS_PATH}"                -t "elem" -n "font"                                "${_CONF_PATH}" || true
		xmlstarlet ed -L -N N="${_NAME_SPCE}" -s "${_XMLS_PATH}/N:font[last()]" -t "attr" -n "place"  -v "ActiveOnScreenDisplay"   \
		                                      -s "${_XMLS_PATH}/N:font[last()]" -t "elem" -n "name"   -v "Sans"                    \
		                                      -s "${_XMLS_PATH}/N:font[last()]" -t "elem" -n "size"   -v "9"                       \
		                                      -s "${_XMLS_PATH}/N:font[last()]" -t "elem" -n "weight" -v "Normal"                  \
		                                      -s "${_XMLS_PATH}/N:font[last()]" -t "elem" -n "slant"  -v "Normal"                  "${_CONF_PATH}" || true
		xmlstarlet ed -L -N N="${_NAME_SPCE}" -s "${_XMLS_PATH}"                -t "elem" -n "font"                                "${_CONF_PATH}" || true
		xmlstarlet ed -L -N N="${_NAME_SPCE}" -s "${_XMLS_PATH}/N:font[last()]" -t "attr" -n "place"  -v "InactiveOnScreenDisplay" \
		                                      -s "${_XMLS_PATH}/N:font[last()]" -t "elem" -n "name"   -v "Sans"                    \
		                                      -s "${_XMLS_PATH}/N:font[last()]" -t "elem" -n "size"   -v "9"                       \
		                                      -s "${_XMLS_PATH}/N:font[last()]" -t "elem" -n "weight" -v "Normal"                  \
		                                      -s "${_XMLS_PATH}/N:font[last()]" -t "elem" -n "slant"  -v "Normal"                  "${_CONF_PATH}" || true
	fi

	if [ -f "${_CONF_PATH}" ]; then
		bash -c 'diff --color=auto <(xmlstarlet fo '"${_XDGS_PATH}"') <(xmlstarlet fo '"${_CONF_PATH}"')'
	fi

	exit 0

diffの出力

user@live-debian:~$ ./sample.sh
39c39
<     <name>Onyx</name>
---
>     <name>Clearlooks-3.4</name>
54,55c54,55
<       <name>sans</name>
<       <size>10</size>
---
>       <name>Sans</name>
>       <size>9</size>
63,64c63,64
<       <name>sans</name>
<       <size>10</size>
---
>       <name>Sans</name>
>       <size>9</size>
72,73c72,73
<       <name>sans</name>
<       <size>10</size>
---
>       <name>Sans</name>
>       <size>9</size>
81,82c81,82
<       <name>sans</name>
<       <size>10</size>
---
>       <name>Sans</name>
>       <size>9</size>
90,91c90,91
<       <name>sans</name>
<       <size>10</size>
---
>       <name>Sans</name>
>       <size>9</size>
96a97,108
>     </font>
>     <font place="ActiveOnScreenDisplay">
>       <name>Sans</name>
>       <size>9</size>
>       <weight>Normal</weight>
>       <slant>Normal</slant>
>     </font>
>     <font place="InactiveOnScreenDisplay">
>       <name>Sans</name>
>       <size>9</size>
>       <weight>Normal</weight>
>       <slant>Normal</slant>

あとがき

ググっても名前空間について触れている記事が見つけられず調べるのに時間がかかったのでこれを残す。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?