Here we’ll show how XPath works. Let’s take the following XML as a lab rat:
<?xml version="1.0" encoding="UTF-8"?> <list> <item new='true'> <title lang="en">Pop-Music DVD</title> <author >K. A. Bred</author> <year>2012</year> <prices> <price currency="USD">29.99</price> <price currency="EUR">23.2</price> </prices> </item> <item new='false'> <title>Gone with the wind</title> <author>M. Mitchell</author> <year>1936</year> <prices> <price currency="USD">19.05</price> <price currency="EUR">15</price> </prices> </item> </list>
Select the year of the second item
//item[2]/year
<year>1936</year>
Select all USD prices (price nodes)
//price[@currency=’USD’]
<price currency="USD">29.99</price>
<price currency="USD">19.05</price>
Get all names of items with price>20
//price[text()>20]/preceding::title/text()
Pop-Music DVD
Get text of all EUR price nodes having any text
//price[@currency=”EUR” and text()]/text()
23.2 15
Get everything following any title with non-English language
//title[ not (@lang=’en’) ]/ following::*
<author>M. Mitchell</author> <year>1936</year> <prices> <price currency="USD">19.05</price> <price currency="EUR">15</price> </prices>
Get all names of items with price>20
//price[text()>20]/preceding::title/text()
Pop-Music DVD
Get all items of 20th century
//item[(year/text()>=1901) and (year/text()<=2000)]
or
//item[(year>=1901) and (year<=2000)]
<item new='false'> <title>Gone with the wind</title> <author>M. Mitchell</author> <year>1936</year> <prices> <price currency="USD">19.05</price> <price currency="EUR">15</price> </prices> </item>
Get all names of items with price>20
//price[text()>20]/preceding::title/text()
Pop-Music DVD
Get all attributes
//@*
new="true" lang="en" currency="USD" currency="EUR" new="false" currency="USD" currency="EUR"
Get all authors and years
//author | //year
<author>K. A. Bred</author> <year>2012</year> <author>M. Mitchell</author> <year>1936</year>
Get all titles starting with Gone
//title[starts-with(text(), “Gone”)]
<title>Gone with the wind</title>
Get total sum of all USD prices
*Function sum() is supported starting from XPath 2.0
sum(//price[@currency=’USD’])
or longer version:
/list/sum(item/prices/price[@currency=’USD’])
49.04