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

问题描述 投票:0回答:5

不确定标题是否清楚,但基本上我有一些如下所示的 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 bash xmlstarlet xmllint
5个回答
2
投票

输入

首先,您的 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 属性并打印所有包含的数字。


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
节点,其值为
Test1

/@id
id
属性值(
result
元素)


0
投票

也许一个简单的 grep 和 awk 解决方案适合您。

grep -B1 Test1 sample.xml | awk '/id=/{gsub(/[^0-9]+/, "", $0); print $0 }'

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

xpath 查询是:

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

返回的信息是:9572385354

    • 获取'name'元素为“Test1”的特定'result'节点

xpath 查询是:

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

返回的信息是:

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

组合的 xpath 查询是:

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

返回的信息是1234567890

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


0
投票

这样的东西应该与 xmlstarlet 一起使用(对我有用):

xmlstarlet sel --template --match "/details/result[name='Test1']" --value-of "@id" test.xml
© www.soinside.com 2019 - 2024. All rights reserved.