38

I try to pipe curl and xmllint to parse the xml output from an url. But for some reason xml won't parse the xml and instead the resulting xml from the curl is shown. I'm a missing a setting? If is store the result of the curl action as a file and use that as an input for xmllint it parses correctly.

 curl --location --header "Accept: application/rdf+xml" http://www.test.com | xmllint --format - --xpath '//title'
Thomas
  • 523
  • 1
  • 5
  • 14
  • Perhaps it prints to stderr and you need `2>&1`? Or you could use my [xidel](http://videlibri.sourceforge.net/xidel.html) `http://www.test.com -e //title ` then you do not need to pipe – BeniBela Nov 11 '13 at 14:50

2 Answers2

65

Seems that xmllint requires the - stdin redirect be at the end of the command.

curl --location --header "Accept: application/rdf+xml" http://www.test.com \
  | xmllint --format --xpath '//title' -
Sean Allred
  • 3,558
  • 3
  • 32
  • 71
bishopthom
  • 651
  • 5
  • 4
11

more succinct

curl foo.com/somefile.xml | xmllint --format -

Explanation:

Here we are piping the xml from the curl command into the xmllint command. The xmllint man page says

$ man xmllint
> ... The xmllint program parses one or more XML files, specified on the command line as XML-FILE (or the standard input if the filename provided is - ).

So that's why we do xmllint --format - because this particular command will read from stdin if you specify - as the filename. Sidenote, there's a discussion about the - arg here. I personally don't like that stdin is not the default but I'm not the author.

Harry Moreno
  • 10,231
  • 7
  • 64
  • 116