发生以下情况:
按预期工作的文件:
列出xml中的内容:
# xmlstarlet el -a table.xml
table
table/rec
table/rec/@id
table/rec/numField
table/rec/stringField
table/rec
table/rec/@id
table/rec/numField
table/rec/stringField
table/rec
table/rec/@id
table/rec/numField
table/rec/stringField
选择特定元素:
# xmlstarlet sel -t -v "//table/rec/numField" table.xml
123
346
-23
原始数据:
#cat table.xml
<?xml version="1.0" encoding="UTF-8"?>
<table>
<rec id="1">
<numField>123</numField>
<stringField>String Value</stringField>
</rec>
<rec id="2">
<numField>346</numField>
<stringField>Text Value</stringField>
</rec>
<rec id="3">
<numField>-23</numField>
<stringField>stringValue</stringField>
</rec>
</table>
接下来运行test.xml
# xmlstarlet el -a test.xml
filelists
filelists/@xmlns
filelists/@packages
filelists/package
filelists/package/@pkgid
filelists/package/@name
filelists/package/@arch
filelists/package/version
filelists/package/version/@epoch
filelists/package/version/@ver
filelists/package/version/@rel
filelists/package/file
filelists/package/file
filelists/package/file
filelists/package/file
filelists/package/file/@type
以与上一个相同的方式查询:
# xmlstarlet sel -t -v "//filelists/package/file" test.xml
#
文件内容:
#cat test.xml
<?xml version="1.0" encoding="UTF-8"?>
<filelists xmlns="http://linux.duke.edu/metadata/filelists" packages="8">
<package pkgid="fc2a76ba4e6e0b2bc704b9e7bcb205ca1c11e93b" name="bigtop-utils" arch="noarch">
<version epoch="0" ver="0.4+300" rel="1.cdh4.0.1.p0.1.el6"/>
<file>/etc/default/bigtop-utils</file>
<file>/usr/libexec/bigtop-detect-javahome</file>
<file>/usr/share/doc/bigtop-utils-0.4+300/LICENSE</file>
<file type="dir">/usr/share/doc/bigtop-utils-0.4+300</file>
</package>
</filelists>
I guess I don't get something here.
为什么我无法显示这些文件标签的内容?我是否需要以某种方式逃脱它?
答案 0 :(得分:2)
您必须使用-N
开关声明命名空间,并将其用于其范围内的所有元素(请注意,我已将命令拆分为行以避免markdown
滚动):
xmlstarlet sel \
-N 'x=http://linux.duke.edu/metadata/filelists' \
-t \
-v \
"//x:filelists/x:package/x:file" \
test.xml
它产生:
/etc/default/bigtop-utils
/usr/libexec/bigtop-detect-javahome
/usr/share/doc/bigtop-utils-0.4+300/LICENSE
/usr/share/doc/bigtop-utils-0.4+300
答案 1 :(得分:1)
从版本1.2.1开始,您可以使用de default namespace _
(删除-N
参数)
xmlstarlet sel -t -v "//_:filelists/_:package/_:file" test.xml
正如here所说:
1.3。更方便的解决方案
XML文档也可以使用不同的名称空间前缀 文件中的元素。为了处理名称空间更大 简单,XMLStarlet(版本1.2.1+)将使用名称空间前缀 在输入文档的根元素上声明。默认 命名空间将绑定到前缀&#34; _&#34;和&#34; DEFAULT&#34; (在版本中 1.5.0 +)。