不确定标题是否清晰,但基本上我有一些类似以下的XML:
<details>
<result id=1234567890>
<name>Test1</name>
</result>
<result id=5345345433>
<name>Test2</name>
</result>
<result id=9572385354>
<name>Test3</name>
</result>
我要完成的工作是找到使用已知值的id属性 即Test1> 1234567890,Test2> 5345345433,Test3> 9572385354
最好使用xmllint,但也可以选择xmlstarlet。
答案 0 :(得分:2)
输入
首先,您的XML无效。您的id属性需要被qout,并且没有关闭详细信息。这是修改后的输入:
<details>
<result id="1234567890">
<name>Test1</name>
</result>
<result id="5345345433">
<name>Test2</name>
</result>
<result id="9572385354">
<name>Test3</name>
</result>
</details>
结果
以下将使用xmlstarlet提取给定name属性的特定ID。
xmlstarlet sel -t -c "/details/result[name='Test1']" test.xml | grep -Po "(?<=id=\")[\d]*"
这将返回
1234567890
您还可以在命令中用变量替换Test1。
var=Test1
xmlstarlet sel -t -c "/details/result[name='$var']" test.xml | grep -Po "(?<=id=\")[\d]*"
故障
xmlstarlet sel -t -c "/details/result[name='$var']" test.xml
在匹配$ var的结果中选择所有名称标签。
| grep -Po "(?<=id=\")[\d]*"
使用Perl Regex将输出放入grep,以查找id属性并打印所有包含数字的数字。
答案 1 :(得分:1)
您也可以使用xmllint
:
xmllint --xpath "string(/details/result[name='Test1']/@id)" yourfile.xml
--xpath
:告诉xmllint
使用xpath
语法进行选择。
xpath
选择器的详细信息:
string(/details/result[name='Test1']/@id)
string()
:输入一个字符串
/details/result
:选择result
元素的details
子元素
[name='Test1']
:包含一个值为name
的{{1}}节点
Test1
:/@id
元素的id
属性值
答案 2 :(得分:0)
也许一个简单的grep&awk解决方案将为您服务。
grep -B1 Test1 sample.xml | awk '/id=/{gsub(/[^0-9]+/, "", $0); print $0 }'
答案 3 :(得分:0)
要完整回答OP的问题,
#/bin/bash
#
# how to use xmllint to get information from specific elements
# REQUIRES libxml2 (sorry Snow Leopard!)
mytestxml='
<details>
<result id="1234567890">
<name>Test1</name>
</result>
<result id="5345345433">
<name>Test2</name>
</result>
<result id="9572385354">
<name>Test3</name>
</result>
</details>
'
echo Test Document is :"$mytestxml"
echo Get the contents of the \''id'\' attribute of a specific \''result'\' element
query=\''string(/details/result[3]/@id)'\'
echo xpath query is "$query"
myresult=$(echo "$mytestxml" | xmllint --xpath 'string(/details/result[3]/@id)' - )
echo info returned is "$myresult"
echo ""
echo Get the specific \''result'\' node whose \''name'\' element is \"Test1\"
query=\''/details/result[name="Test1"]'\'
echo xpath query is "$query"
myresult=$(echo "$mytestxml" | xmllint --xpath '/details/result[name="Test1"]' - )
echo info returned is "$myresult"
echo ""
echo Get the \''id'\' attribute of the specific \''result'\' node whose \''name'\' element is \"Test1\"
query=\''string(/details/result[name="Test1"]/@id)'\'
echo combined xpath query is "$query"
myresult=$(echo "$mytestxml" | xmllint --xpath 'string(/details/result[name="Test1"]/@id)' - )
echo info returned is "$myresult"
xpath查询为:
'string(/details/result[3]/@id)'
返回的信息是:9572385354
xpath查询为:
'/details/result[name="Test1"]'
返回的信息是:
<result id="1234567890">
<name>Test1</name>
</result>
组合的xpath查询是:
'string(/details/result[name="Test1"]/@id)'
返回的信息是1234567890
希望这对其他找到此页面的人有用。 :o)