不确定标题是否清楚,但基本上我有一些如下所示的 XML:
<details>
<result id=1234567890>
<name>Test1</name>
</result>
<result id=5345345433>
<name>Test2</name>
</result>
<result id=9572385354>
<name>Test3</name>
</result>
我想要完成的是找到使用已知值的 id 属性 即测试1 > 1234567890,测试2 > 5345345433,测试3 > 9572385354
最好使用 xmllint,但 xmlstarlet 也是一个选项。
输入
首先,您的 XML 无效。你的id属性需要被qouted,并且详细信息没有关闭。这是修改后的输入:
<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 属性并打印所有包含的数字。
您还可以使用
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
节点,其值为Test1
/@id
:id
属性值(result
元素)
也许一个简单的 grep 和 awk 解决方案适合您。
grep -B1 Test1 sample.xml | awk '/id=/{gsub(/[^0-9]+/, "", $0); print $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)
这样的东西应该与 xmlstarlet 一起使用(对我有用):
xmlstarlet sel --template --match "/details/result[name='Test1']" --value-of "@id" test.xml