This articleneeds additional citations forverification. Please helpimprove this article byadding citations to reliable sources. Unsourced material may be challenged and removed. Find sources: "XPath" – news ·newspapers ·books ·scholar ·JSTOR(August 2010) (Learn how and when to remove this message) |
| XPath | |
|---|---|
| Paradigm | Query language |
| Developer | W3C |
| First appeared | 1998 |
| Stable release | 3.1 / March 21, 2017; 8 years ago (2017-03-21) |
| Influenced by | |
| XSLT,XPointer | |
| Influenced | |
| XML Schema,XForms,JSONPath | |
XPath (XML Path Language) is anexpression language designed to support the query or transformation ofXML documents. It was defined by theWorld Wide Web Consortium (W3C) in 1999,[1] and can be used to compute values (e.g.,strings, numbers, orBoolean values) from the content of an XML document. Support for XPath exists in applications that support XML, such as web browsers, and many programming languages.
The XPath language is based on atree representation of the XML document, and provides the ability to navigate around the tree, selecting nodes by a variety of criteria.[2][3] In popular use (though not in the official specification), an XPath expression is often referred to simply as "an XPath".
Originally motivated by a desire to provide a common syntax and behavior model betweenXPointer andXSLT, subsets of the XPathquery language are used in otherW3C specifications such asXML Schema,XForms and theInternationalization Tag Set (ITS).
XPath has been adopted by a number of XML processing libraries and tools, many of which also offerCSS Selectors, another W3C standard, as a simpler alternative to XPath.
There are several versions of XPath in use. XPath 1.0 was published in 1999, XPath 2.0 in 2007 (with a second edition in 2010), XPath 3.0 in 2014, and XPath 3.1 in 2017. However, XPath 1.0 is still the version that is most widely available.[1]
for expression that is a cut-down version of the "FLWOR" expressions in XQuery. It is possible to describe the language by listing the parts of XQuery that it leaves out: the main examples are the query prolog, element and attribute constructors, the remainder of the "FLWOR" syntax, and thetypeswitch expression.
The most important kind of expression in XPath is alocation path. A location path consists of a sequence oflocation steps. Each location step has three components:
An XPath expression is evaluated with respect to acontext node. An Axis Specifier such as 'child' or 'descendant' specifies the direction to navigate from the context node. The node test and the predicate are used to filter the nodes specified by the axis specifier: For example, the node test 'A' requires that all nodes navigated to must have label 'A'. A predicate can be used to specify that the selected nodes have certain properties, which are specified by XPath expressions themselves.
The XPath syntax comes in two flavors: theabbreviated syntax, is more compact and allows XPaths to be written and read easily using intuitive and, in many cases, familiar characters and constructs. Thefull syntax is more verbose, but allows for more options to be specified, and is more descriptive if read carefully.
The compact notation allows many defaults and abbreviations for common cases. Given source XML containing at least
<A><B><C/></B></A>
the simplest XPath takes a form such as
/A/B/Cthat selects C elements that are children of B elements that are children of the A element that forms the outermost element of the XML document. The XPath syntax is designed to mimic URI (Uniform Resource Identifier) andUnix-style file path syntax.
More complex expressions can be constructed by specifying an axis other than the default 'child' axis, a node test other than a simple name, or predicates, which can be written in square brackets after any step. For example, the expression
A//B/*[1]selects the first child ('*[1]'), whatever its name, of every B element that itself is a child or other, deeper descendant ('//') of an A element that is a child of the current context node (the expression does not begin with a '/'). The predicate[1] binds more tightly than the/ operator. To select the first node selected by the expressionA//B/*, write(A//B/*)[1]. Note also, index values in XPath predicates (technically, 'proximity positions' of XPath node sets) start from 1, not 0 as common in languages like C and Java.
In the full, unabbreviated syntax, the two examples above would be written
/child::A/child::B/child::Cchild::A/descendant-or-self::node()/child::B/child::node()[position()=1]Here, in each step of the XPath, theaxis (e.g.child ordescendant-or-self) is explicitly specified, followed by:: and then thenode test, such asA ornode() in the examples above.
Here the same, but shorter:A//B/*[position()=1]
Axis specifiers indicate navigation direction within the tree representation of the XML document. The axes available are:[b]
| Full syntax | Abbreviated syntax | Notes |
|---|---|---|
ancestor | ||
ancestor-or-self | ||
attribute | @ | @abc is short forattribute::abc |
child | xyz is short forchild::xyz | |
descendant | ||
descendant-or-self | // | // is short for/descendant-or-self::node()/ |
following | ||
following-sibling | ||
namespace | ||
parent | .. | .. is short forparent::node() |
preceding | ||
preceding-sibling | ||
self | . | . is short forself::node() |
As an example of using theattribute axis in abbreviated syntax,//a/@href selects the attribute calledhref ina elements anywhere in the document tree.The expression. (an abbreviation forself::node()) is most commonly used within a predicate to refer to the currently selected node.For example,h3[.='See also'] selects an element calledh3 in the current context, whose text content isSee also.
Node tests may consist of specific node names or more general expressions. In the case of an XML document in which the namespace prefixgs has been defined,//gs:enquiry will find all theenquiry elements in that namespace, and//gs:* will find all elements, regardless of local name, in that namespace.
Other node test formats are:
<!-- Comment -->hello in<k>hello<m> world</m></k><?phpecho$a;?>. In this case,processing-instruction('php') would match.Predicates, written as expressions in square brackets, can be used tofilter a node-set according to some condition. For example,a returns a node-set (all thea elements which are children of the context node), anda[@href='help.php'] keeps only those elements having anhref attribute with the valuehelp.php.
There is no limit to the number of predicates in a step, and they need not be confined to the last step in an XPath. They can also be nested to any depth. Paths specified in predicates begin at the context of the current step (i.e. that of the immediately preceding node test) and do not alter that context. All predicates must be satisfied for a match to occur.
When the value of the predicate is numeric, it is syntactic-sugar for comparing against the node's position in the node-set (as given by the functionposition()). Sop[1] is shorthand forp[position()=1] and selects the firstp element child, whilep[last()] is shorthand forp[position()=last()] and selects the lastp child of the context node.
In other cases, the value of the predicate is automatically converted to a Boolean. When the predicate evaluates to a node-set, the result is true when the node-set isnon-empty[clarify]. Thusp[@x] selects thosep elements that have an attribute namedx.
A more complex example: the expressiona[/html/@lang='en'][@href='help.php'][1]/@target selects the value of thetarget attribute of the firsta element among the children of the context node that has itshref attribute set tohelp.php, provided the document'shtml top-level element also has alang attribute set toen. The reference to an attribute of the top-level element in the first predicate affects neither the context of other predicates nor that of the location step itself.
Predicate order is significant if predicates test the position of a node. Each predicate takes a node-set returns a (potentially) smaller node-set. Soa[1][@href='help.php'] will find a match only if the firsta child of the context node satisfies the condition@href='help.php', whilea[@href='help.php'][1] will find the firsta child that satisfies this condition.
XPath 1.0 defines four data types: node-sets (sets of nodes with no intrinsic order), strings, numbers and Booleans.
The available operators are:
/,// and[...] operators, used in path expressions, as described above.|, which forms the union of two node-sets.and andor, and a functionnot()+,-,*,div (divide), andmod=,!=,<,>,<=,>=The function library includes:
Some of the more commonly useful functions are detailed below.[c]
true ifs1 starts withs2true ifs1 containss2substring("ABCDEF",2,3) returnsBCD.substring-before("1999/04/01","/") returns1999substring-after("1999/04/01","/") returns04/01Expressions can be created inside predicates using the operators:=, !=, <=, <, >= and>. Boolean expressions may be combined with brackets() and the Boolean operatorsand andor as well as thenot() function described above. Numeric calculations can use*, +, -, div andmod. Strings can consist of anyUnicode characters.
//item[@price>2*@discount] selects items whose price attribute is greater than twice the numeric value of their discount attribute.
Entire node-sets can be combined ('unioned') using the vertical bar character |. Node sets that meet one or more of several conditions can be found by combining the conditions inside a predicate with 'or'.
v[x or y] | w[z] will return a single node-set consisting of all thev elements that havex ory child-elements, as well as all thew elements that havez child-elements, that were found in the current context.
Given a sample XML document
<?xml version="1.0" encoding="utf-8"?><Wikimedia><projects><projectname="Wikipedia"launch="2001-01-05"><editions><editionlanguage="English">en.wikipedia.org</edition><editionlanguage="German">de.wikipedia.org</edition><editionlanguage="French">fr.wikipedia.org</edition><editionlanguage="Polish">pl.wikipedia.org</edition><editionlanguage="Spanish">es.wikipedia.org</edition></editions></project><projectname="Wiktionary"launch="2002-12-12"><editions><editionlanguage="English">en.wiktionary.org</edition><editionlanguage="French">fr.wiktionary.org</edition><editionlanguage="Vietnamese">vi.wiktionary.org</edition><editionlanguage="Turkish">tr.wiktionary.org</edition><editionlanguage="Spanish">es.wiktionary.org</edition></editions></project></projects></Wikimedia>
The XPath expression
/Wikimedia/projects/project/@name
selects name attributes for all projects, and
/Wikimedia//editions
selects all editions of all projects, and
/Wikimedia/projects/project/editions/edition[@language='English']/text()selects addresses of all English Wikimedia projects (text of alledition elements wherelanguage attribute is equal toEnglish). And the following
/Wikimedia/projects/project[@name='Wikipedia']/editions/edition/text()selects addresses of all Wikipedias (text of alledition elements that exist underproject element with a name attribute ofWikipedia).
TheJavapackagejavax.xml.xpath has been part of Java standard edition since Java 5[12] via theJava API for XML Processing. Technically this is an XPathAPI rather than an XPath implementation, and it allows the programmer the ability to select a specific implementation that conforms to the interface.
document.evaluate()[13] inweb browsers.XPath is increasingly used to express constraints in schema languages for XML.
Since: 1.5
Selectors are patterns we can use to find one or more elements on a page so we can then work with the data within the element. scrapy supports either CSS selectors or XPath selectors.