Professional Documents
Culture Documents
XPath is used to navigate through elements and attributes in an XML document. What You Should Already Know Before you continue you should have a basic understanding of the following: HTML / XHTML XML / XML Namespaces f you want to study these sub!ects first" find the tutorials on our Home page# What is XPath X$ath is a synta% for defining parts of an XML document X$ath uses path e%pressions to navigate in XML documents X$ath contains a library of standard functions X$ath is a ma!or element in X< X$ath is a '() &tandard XPath Path !"#ressions X$ath uses path e%pressions to select nodes or node*sets in an XML document# These path e%pressions loo+ very much li+e the e%pressions you see when you wor+ with a traditional computer file system# XPath Standard $unctions X$ath includes over ,-- built*in functions# There are functions for string values" numeric values" date and time comparison" node and .Name manipulation" se/uence manipulation" Boolean values" and more# XPath is %sed in XSL& X$ath is a ma!or element in the X< standard# 'ithout X$ath +nowledge you will not be able to create X< documents# 0ou can read more about X< in our X< tutorial# X.uery and X$ointer are both built on X$ath e%pressions# X.uery ,#- and X$ath 1#- share the same data model and support the same functions and operators# 0ou can read more about X.uery in our X.uery tutorial# XPath is a W'( Standard X$ath became a '() 2ecommendation ,3# November ,444# X$ath was designed to be used by X<" X$ointer and other XML parsing software# 0ou can read more about the X$ath standard in our '() tutorial# XPath )odes *n XPath+ there are seven ,inds of nodes- element+ attribute+ te"t+ names#ace+ #rocessing.instruction+ comment+ and document /root0 nodes. XPath &erminology )odes n X$ath" there are seven +inds of nodes: element" attribute" te%t" namespace" processing*instruction" comment" and document 5root6 nodes# XML documents are treated as trees of nodes# The root of the tree is called the document node 5or root node6# Loo+ at the following XML document: 78%ml version9:,#-: encoding9: &;*<<=4*,:8> 7boo+store> 7boo+> 7title lang9:en:>Harry $otter7/title> 7author>? @# 2owling7/author> 7year>1--=7/year> 7price>14#447/price> 7/boo+> 7/boo+store>
A%ample of nodes in the XML document above: 7boo+store> 5document node6 7author>? @# 2owling7/author> 5element node6 lang9:en: 5attribute node6 Atomic values Btomic values are nodes with no children or parent# A%ample of atomic values: ? @# 2owling :en: *tems tems are atomic values or nodes# 1elationshi# of )odes Parent Aach element and attribute has one parent# n the following e%ampleC the boo+ element is the parent of the title" author" year" and price: 7boo+> 7title>Harry $otter7/title> 7author>? @# 2owling7/author> 7year>1--=7/year> 7price>14#447/price> 7/boo+> (hildren Alement nodes may have Dero" one or more children# n the following e%ampleC the title" author" year" and price elements are all children of the boo+ element: 7boo+> 7title>Harry $otter7/title> 7author>? @# 2owling7/author> 7year>1--=7/year> 7price>14#447/price> 7/boo+> Siblings Nodes that have the same parent# n the following e%ampleC the title" author" year" and price elements are all siblings: 7boo+> 7title>Harry $otter7/title> 7author>? @# 2owling7/author> 7year>1--=7/year> 7price>14#447/price> 7/boo+> Ancestors B nodeEs parent" parentEs parent" etc# n the following e%ampleC the ancestors of the title element are the boo+ element and the boo+store element: 7boo+store> 7boo+> 7title>Harry $otter7/title> 7author>? @# 2owling7/author> 7year>1--=7/year> 7price>14#447/price>
7/boo+> 7/boo+store> 2escendants B nodeEs children" childrenEs children" etc# n the following e%ampleC descendants of the boo+store element are the boo+" title" author" year" and price elements: 7boo+store> 7boo+> 7title>Harry $otter7/title> 7author>? @# 2owling7/author> 7year>1--=7/year> 7price>14#447/price> 7/boo+> 7/boo+store> XPath Synta" XPath uses #ath e"#ressions to select nodes or node.sets in an XML document. &he node is selected by following a #ath or ste#s. &he XML !"am#le 2ocument 'e will use the following XML document in the e%amples below# 78%ml version9:,#-: encoding9: &;*<<=4*,:8> 7boo+store> 7boo+> 7title lang9:eng:>Harry $otter7/title> 7price>14#447/price> 7/boo+> 7boo+> 7title lang9:eng:>Learning XML7/title> 7price>(4#4=7/price> 7/boo+> 7/boo+store> Selecting )odes X$ath uses path e%pressions to select nodes in an XML document# The node is selected by following a path or steps# The most useful path e%pressions are listed below: !"#ression 2escri#tion nodename &elects all child nodes of the named node / &elects from the root node // &elects nodes in the document from the current node that match the selection no matter where they are # &elects the current node ## &elects the parent of the current node F &elects attributes !"am#les n the table below we have listed some path e%pressions and the result of the e%pressions: Path !"#ression 1esult
boo+store /boo+store
&elects all the child nodes of the boo+store element &elects the root element boo+store )ote- f the path starts with a slash 5 / 6 it always represents an absolute path to an elementG &elects all boo+ elements that are children of boo+store &elects all boo+ elements no matter where they are in the document &elects all boo+ elements that are descendant of the boo+store element" no matter where they are under the boo+store element &elects all attributes that are named lang
Predicates $redicates are used to find a specific node or a node that contains a specific value# $redicates are always embedded in s/uare brac+ets# !"am#les n the table below we have listed some path e%pressions with predicates and the result of the e%pressions: Path !"#ression 1esult /boo+store/boo+H,I &elects the first boo+ element that is the child of the boo+store element# )ote- A= and later has implemented that H-I should be the first node" but according to the '() standard it should have been H,IGG /boo+store/boo+Hlast56I &elects the last boo+ element that is the child of the boo+store element /boo+store/boo+Hlast56*,I &elects the last but one boo+ element that is the child of the boo+store element /boo+store/boo+Hposition567(I &elects the first two boo+ elements that are children of the boo+store element //titleHFlangI &elects all the title elements that have an attribute named lang //titleHFlang9EengEI &elects all the title elements that have an attribute named lang with a value of EengE /boo+store/boo+Hprice>(=#--I &elects all the boo+ elements of the boo+store element that have a price element with a value greater than (=#-/boo+store/boo+Hprice>(=#--I/title &elects all the title elements of the boo+ elements of the boo+store element that have a price element with a value greater than (=#-Selecting %n,nown )odes X$ath wildcards can be used to select un+nown XML elements# Wildcard 2escri#tion J Matches any element node FJ Matches any attribute node node56 Matches any node of any +ind !"am#les
n the table below we have listed some path e%pressions and the result of the e%pressions: Path !"#ression 1esult /boo+store/J &elects all the child nodes of the boo+store element //J &elects all elements in the document //titleHFJI &elects all title elements which have any attribute Selecting Several Paths By using the K operator in an X$ath e%pression you can select several paths# !"am#les n the table below we have listed some path e%pressions and the result of the e%pressions: Path !"#ression 1esult //boo+/title K //boo+/price &elects all the title BNL price elements of all boo+ elements //title K //price &elects all the title BNL price elements in the document /boo+store/boo+/title K //price &elects all the title elements of the boo+ element of the boo+store element BNL all the price elements in the document XPath A"es &he XML !"am#le 2ocument 'e will use the following XML document in the e%amples below# 78%ml version9:,#-: encoding9: &;*<<=4*,:8> 7boo+store> 7boo+> 7title lang9:eng:>Harry $otter7/title> 7price>14#447/price> 7/boo+> 7boo+> 7title lang9:eng:>Learning XML7/title> 7price>(4#4=7/price> 7/boo+> 7/boo+store> XPath A"es Bn a%is defines a node*set relative to the current node# A"is)ame 1esult ancestor &elects all ancestors 5parent" grandparent" etc#6 of the current node ancestor*or*self &elects all ancestors 5parent" grandparent" etc#6 of the current node and the current node itself attribute &elects all attributes of the current node child &elects all children of the current node descendant &elects all descendants 5children" grandchildren" etc#6 of the current node descendant*or*self &elects all descendants 5children" grandchildren" etc#6 of the current node and the current node itself following &elects everything in the document after the closing tag of the
current node &elects all siblings after the current node &elects all namespace nodes of the current node &elects the parent of the current node &elects everything in the document that is before the start tag of the current node &elects all siblings before the current node &elects the current node
Location Path !"#ression B location path can be absolute or relative# Bn absolute location path starts with a slash 5 / 6 and a relative location path does not# n both cases the location path consists of one or more steps" each separated by a slash: Bn absolute location path: /step/step/### B relative location path: step/step/### Aach step is evaluated against the nodes in the current node*set# B step consists of: an a%is 5defines the tree*relationship between the selected nodes and the current node6 a node*test 5identifies a node within an a%is6 Dero or more predicates 5to further refine the selected node*set6 The synta% for a location step is: a%isname::nodetestHpredicateI !"am#les !"am#le 1esult child::boo+ attribute::lang child::J attribute::J child::te%t56 child::node56 descendant::boo+ ancestor::boo+ ancestor*or*self::boo+ child::J/child::price XPath 3#erators An XPath e"#ression returns either a node.set+ a string+ a 4oolean+ or a number. XPath 3#erators Below is a list of the operators that can be used in X$ath e%pressions: &elects all boo+ nodes that are children of the current node &elects the lang attribute of the current node &elects all children of the current node &elects all attributes of the current node &elects all te%t child nodes of the current node &elects all child nodes of the current node &elects all boo+ descendants of the current node &elects all boo+ ancestors of the current node &elects all boo+ ancestors of the current node * and the current as well if it is a boo+ node &elects all price grandchildren of the current node
2escri#tion )omputes two node*sets Bddition &ubtraction Multiplication Livision A/ual Not e/ual Less than Less than or e/ual to Oreater than Oreater than or e/ual to or and Modulus 5division remainder6
!"am#le //boo+ K //cd 3MN 3*N 3JN < div N price94#<priceG94#<price74#<price794#<price>4#<price>94#<price94#<- or price94#Pprice>4#-- and price74#4= mod 1
1eturn value 2eturns a node*set with all boo+ and cd elements ,1 1N 1 true if price is 4#<false if price is 4#4true if price is 4#4false if price is 4#<true if price is 4#-false if price is 4#<true if price is 4#-false if price is 4#4true if price is 4#4false if price is 4#<true if price is 4#4false if price is 4#Ptrue if price is 4#<false if price is 4#=true if price is 4#<false if price is <#=,
XPath !"am#les Let5s try to learn some basic XPath synta" by loo,ing at some e"am#les. &he XML !"am#le 2ocument 'e will use the following XML document in the e%amples below# :boo+s#%ml:: 78%ml version9:,#-: encoding9: &;*<<=4*,:8> 7boo+store> 7boo+ category9:);;@ NO:> 7title lang9:en:>Averyday talian7/title> 7author>Oiada Le Laurentiis7/author> 7year>1--=7/year> 7price>(-#--7/price> 7/boo+> 7boo+ category9:)H LL2AN:> 7title lang9:en:>Harry $otter7/title> 7author>? @# 2owling7/author> 7year>1--=7/year> 7price>14#447/price> 7/boo+> 7boo+ category9:'AB:>
7title lang9:en:>X.uery @ic+ &tart7/title> 7author>?ames McOovern7/author> 7author>$er Bothner7/author> 7author>@urt )agle7/author> 7author>?ames Linn7/author> 7author>Qaidyanathan Nagara!an7/author> 7year>1--(7/year> 7price>N4#447/price> 7/boo+> 7boo+ category9:'AB:> 7title lang9:en:>Learning XML7/title> 7author>Ari+ T# 2ay7/author> 7year>1--(7/year> 7price>(4#4=7/price> 7/boo+> 7/boo+store> Qiew the :boo+s#%ml: file in your browser# Selecting )odes Rnfortunately" there are different ways of dealing with XML and X$ath in nternet A%plorer based browsers and other browsers 5li+e MoDilla based browsers6# n our e%amples we have included code that should wor+ with most ma!or browsers# Select nodes for *nternet !"#lorer based browsers Rsing the Microsoft XMLL;M ob!ect to load the XML document and the selectNodes56 method to select nodes from the XML document: %mlLoc9new BctiveX;b!ect5:Microsoft#XMLL;M:6C %mlLoc#async9falseC %mlLoc#load5:boo+s#%ml:6C %mlLoc#selectNodes5xpath6C Select nodes for other browsers Rsing the implementation56 method of the document ob!ect to load the XML document and the evaluate56 method to select nodes from the XML document: %mlLoc9document#implementation#createLocument5::"::"null6C %mlLoc#async9falseC %mlLoc#load5:boo+s#%ml:6C document#evaluate5xpath" %mlLoc" null" X$ath2esult#BN0ST0$A"null6C Select titles from all boo, )odes The following path synta% selects all the title nodes: /boo+store/boo+/title Try it yourself# Select the title of the first boo, )ode The following path synta% selects only the title of the first boo+ node under the boo+store element: /boo+store/boo+H,I/title Try it yourself There is a problem with this# The e%ample above shows different results in A and other browsers# A= and later has implemented that H-I should be the first node" but according to the '() standard it should have been H,IGG A Wor,around6
To solve the H-I and H,I problem in A=M" you can set the &electionLanguage to X$ath# The following path synta% selects only the title of the first boo+ node under the boo+store element: xml#set$roperty5:&electionLanguage:":X$ath:6C xml#selectNodes5:/boo+store/boo+H,I/title:6C Try it yourself Select the #rices The following path synta% selects the te%t from all the price nodes: /boo+store/boo+/price/te%t56 Try it yourself# Selecting #rice )odes with Price7'8 The following path synta% selects all the price nodes with a price higher than (=: /boo+store/boo+Hprice>(=I/price Try it yourself# Selecting title )odes with Price7'8 The following path synta% selects all the title nodes with a price higher than (=: /boo+store/boo+Hprice>(=I/title Try it yourself# !"am#le (ode to chech the above document7html> 7body> 7script type9:te%t/!avascript:> function loadXMLLoc5fname6 T var %mlLocC // code for A if 5window#BctiveX;b!ect6 T %mlLoc9new BctiveX;b!ect5:Microsoft#XMLL;M:6C U // code for MoDilla" Virefo%" ;pera" etc# else if 5document#implementation WW document#implementation#createLocument6 T %mlLoc9document#implementation#createLocument5::"::"null6C U else T alert5E0our browser cannot handle this scriptE6C U %mlLoc#async9falseC %mlLoc#load5fname6C return5%mlLoc6C U %ml9loadXMLLoc5:boo+s#%ml:6C path9:/boo+store/boo+H,I/title:C // code for A
if 5window#BctiveX;b!ect6 T var nodes9%ml#selectNodes5path6C for 5i9-Ci7nodes#lengthCiMM6 T document#write5nodesHiI#childNodesH-I#nodeQalue6C document#write5:7br />:6C U U // code for MoDilla" Virefo%" ;pera" etc# else if 5document#implementation WW document#implementation#createLocument6 T var nodes9document#evaluate5path" %ml" null" X$ath2esult#BN0ST0$A"null6C var result9nodes#iterateNe%t56C while5result6 T document#write5result#childNodesH-I#nodeQalue6C document#write5:7br />:6C result9nodes#iterateNe%t56C U U 7/script> 7/body> 7/html>