3

I want to get value of conn of abc whose name is 3 i.e conn3

<abc name="1">
    <properties conn="conn1"/>
</abc>
<abc name="2">
    <properties conn="conn2"/>
</abc>
<abc name="3">
    <properties conn="conn3"/>
</abc>

currently i am doing

echo 'cat //abc/properties/@conn' | xmllint --shell "test.xml"

but it is returning conn1,conn2,conn3

I am trying with

echo 'cat //abc[@name='1']/properties/@conn' | xmllint --shell "test.xml"

but it is not returning anything

Can you please suggest where i am doing wrong. Note:Xpath not supported

Thomas Dickey
  • 51,086
  • 7
  • 70
  • 105
user2387280
  • 85
  • 2
  • 12
  • 1
    Given that XML (and wrapping it in a `` element to make it valid), your second command works for me. I guess what you have is something different? – Tom Fenech Aug 10 '15 at 14:10
  • Works for me, too. Although if you don't have the `--xpath` option, I wonder if your `xmllint` is old and doesn't support the particular query you're using... – larsks Aug 10 '15 at 14:11
  • Printing "/ > / >" to the console – user2387280 Aug 10 '15 at 14:15
  • What is the expected output, exactly? Related for siblings: http://stackoverflow.com/questions/26823736/how-to-parse-out-the-value-of-several-attributes-on-different-elements-with-xmll – Ciro Santilli OurBigBook.com Nov 19 '15 at 05:26

2 Answers2

1

Finally issue was with single inverted comma(') below command worked for me. I don't know the reason, came to know by hit and try :)

Please comment if you know the reason behind it.

echo 'cat //abc[@name="1"]/properties/@conn' | xmllint --shell "test.xml"

Note: Above mentioned XML is only sample actual XML where I want to run is complex structure.

ggorlen
  • 44,755
  • 7
  • 76
  • 106
user2387280
  • 85
  • 2
  • 12
0

Just use xmllint normally, without pipes:

$ xmllint --xpath 'string(//abc[@name='1']/properties/@conn)' xml_file
conn1

See string() is used to get the value of an attribute, as described in Getting attribute using XPath.

Community
  • 1
  • 1
fedorqui
  • 275,237
  • 103
  • 548
  • 598