Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

How to get attribute values of multiple nodes in xpath with just xmllint?

I want to query the names of all the persons in the test.xml below.

<body>
<person name="abc"></person>
<person name="def"></person>
<person name="ghi"></person>
</body>

basic query

This has the problem of including "name", which I don't want.

$ xmllint --xpath '//body/person/@name' test.xml`
 name="abc"
 name="def"
 name="ghi"

string function

Using the string function, I only get one result.

$ xmllint --xpath 'string(//body/person/@name)' test.xml
abc

sed and grep

This works but looks needlessly complicated to me.

xmllint --xpath '//body/person/@name' test.xml | grep -o '"([^"]*)"' | sed 's|"||g'
abc
def
ghi

Question

Is it possible to get multiple values without the attribute name and without using another tool like grep?

question from:https://stackoverflow.com/questions/65936236/how-to-get-attribute-values-of-multiple-nodes-in-xpath-with-just-xmllint

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I don't know about xmllint, but xmlstarlet can do it:

xmlstarlet sel -t -v 'body/person/@name' test.xml

Output:

abc                                  
def
ghi

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...