1

I have this xml file.

<body>
<part1>
   <para1>abc</para1>
   <para2>def</para2>
   <ver>1234</ver>
</part1>    
</body>

I need to store the value given by ver i.e. 1234 in a variable.

2
  • 1
    That question isn't quite a duplicate... It's about extracting an attribute value, not the body of a tag. The answer is going to be very similar, though - just a bit different XPath expression. Commented Mar 18, 2021 at 7:02
  • Yes @Shawn, I went through a lot of questions in which the value was present in the tag itself. I tried modifying those answers but couldn't reach a solution. Thanks for reopening. Commented Mar 18, 2021 at 8:52

1 Answer 1

7

Different options:

  1. using xmlstarlet:
ver=$(xmlstarlet sel -t -m //ver -v . test.xml)
  1. using xmllint (see also Native shell command set to extract node value from XML:
ver=$(xmllint --xpath "//ver/text()" test.xml)
  1. Using gawk:
ver=$(gawk -F "[><]" '/<ver>/{ print $3 }' test.xml)
Sign up to request clarification or add additional context in comments.

3 Comments

The awk one (and it's common to all awks, not gawk-specific) would be more robust as awk -F'[<>]' '$2=="ver"{ print $3 }'. That would not fail if <ver> just happened to exist in some other string in the input.
Thanks Ed, I will always leave some improvement for you 😁😉
Using xidel: ver=$(xidel -s test.xml -e '//ver') or eval "$(xidel -s test.xml -e 'ver:=//ver' --output-format=bash)"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.