使用已知元素查找父元素的属性

时间:2019-07-30 13:22:36

标签: xml bash xmlstarlet xmllint

不确定标题是否清晰,但基本上我有一些类似以下的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。

4 个答案:

答案 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"
    • 获取特定“结果”元素的“ id”属性的内容。

xpath查询为:

    'string(/details/result[3]/@id)'

返回的信息是:9572385354

    • 获取其“名称”元素为“ Test1”的特定“结果”节点

xpath查询为:

    '/details/result[name="Test1"]'

返回的信息是:

    <result id="1234567890">
        <name>Test1</name>
    </result>
    • 获取其“名称”元素为“ Test1”的特定“结果”节点的“ id”属性

组合的xpath查询是:

    'string(/details/result[name="Test1"]/@id)'

返回的信息是1234567890

希望这对其他找到此页面的人有用。 :o)