XPath
XPath, XML Path Language, је упитни језик за одабир чворова из XML документа. Накнадно, XPath може да се користи да израчунава вредности(на пример ниски, бројева, или булеанских вредности) из садржаја XML документа. XPath је дефинисан од стране WWW конзорцијума.[1]
Преглед
Веб стандарди |
---|
Стандарди |
|
Организације |
|
|
|
XPath језик се заснива на представљању XML документа као стабла, и пружа могућност кретања по стаблу, одабирајући чворове разним критеријумима.[2][3] Коликвијално (али не и у званичним спецификацијама), један XPath израз се назива једним „Xpath-ом“.
У почетку мотивисан жељом да се нађе заједничка синтакса и модел понашања између Xpointerа и XSLT-a, подскупови Xpath упитног језика се користе у другим W3C спецификацијама као што су W3C XML Schema, XForms и скуп тагова за интернационализаицју (Internationalization Tag Set (ITS)).
XPath су усвојиле разне алатке и библиотеке за обраду XML-а, од којих многе нуде CSS селекторе, још један W3C стандард, као простију алтернативу за XPath.
Верзије
Тренутно постоје три верзије XPath-а у употреби. Последња верзија језика (од 10.4.2014) је 3.0, али XPath 1.0 је најраспорстрањенија верзија.[1]
- XPath 1.0 је постао препорука 16. новембра 1999. године и у широкој је употреби, било самосталан (позиван преко API-а језика као што су Java, C#, пајтон или јаваскрипт), или уграђен у језике као што су XSLT, XProc XML Schema или Xforms.
- XPath 2.0 је постао препорука 23. јануара 2007. године. Известан број имплементцаија постоји, али оне нису заступљене као XPath 1.0. Спецификација језика XPath 2.0 је много већа од спецификације XPath 1.0, и она мења неке од оснивних концепата тог језика, коао што је, на пример, систем типова.
- Најприметнија промена је то што је XPath 2.0 изграђен око модела података XQuery-a и XPath-a који има много богатији систем типова.[4]Сада се свака вредност представлја као низ(поједниачна атмоичка вредност или чвор се посматра као низ дужине један). Скупови чворова из XPath 1.0 су замењени са низовима чворова, који могу бити у било ком поретку.
- Да би подржавао богатије скупове типова, XPath 2.0 нуди увелико проширен скуп функција и оператора.
- XPath 2.0 је заправо подскуп од XQuery 1.0. Они деле исти модел података (XDM). Он нуди
for
израз који је скраћена верзија „FLWOR“ израза из XQuery-а. Могуће је описати језик наводећи делове XQuery-а које он изоставља: главни примери су упитни пролог, конструктори елемената и атрибута, остатак „FLWOR“ синтаксе, иtypeswitch
израз.
- XPath 3.0 је постао препорука 8. априла 2014. године.[5] најзначајније ново својство и је подршка за посматрање функција као „првокласних“ вредности. XPath 3.0 је подскуп XQuery 3.0-а, и најновије имплементације (април 2014.) постоје као део „погона“.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/8/87/XPath_example.svg/300px-XPath_example.svg.png)
Синтакса и семантика (XPath 1.0)
Најважнија врста израза у XPath-у је путања лоцирања. Путања лоцирања се састоји од низа корака лоцирања. Сваки корак лоцирања има три компоненте:
Вредност XPath израза се израчунава у односу на контекстни чвор. Спецификатор осе као што је 'дете' или 'потомак' наводи правац обиласка ван контекстног чвора. Чвор тест и предикат се користе да издвоје све чворове које наведе спецификатор осе: на пример, чвор тест 'А' захтева да сви чворови који се обиђу имају ознаку 'А'. Предикат се може искористи да наведе да изабрани чворови имају неке особине, које су наведене од стране самих XPath израза.
XPath синтакса долази у два стила: Скраћена синтакса, која је компактнија и омогућава да се XPath изрази пишу и читају са лакоћом користећи интуитивне и, у многим случајевима, познате карактере и конструкте. Потпуна синтакса је опсежнија, али омогућава навођење више опција, и дескриптивија је ако се пажљиво чита.
Скраћена синтакса
Компактна нотација омогућава многе уобичајне изразе и скраћенице у простијим случајевима. За дат XML који садржи
<A> <B> <C/> </B> </A>
најпростији XPath израз је облика
/A/B/C
и он бира све елементе C који су деца свих елемената B који су деца елемента А који формира најобухватнји елемент XML документа. XPath синтакса је осмишљена да опонаша URI и униксолику синтаксу путање датотека.
Сложенији изрази се могу направити наводећи неку осу различиту од подразумеване 'дете' осе, чвор тест различит од обичног имена или предиката који могу бити записани у угластим заградама после сваког корака. На пример, израз
A//B/*[1]
бира прво дете ('*[1]
'), независно од имена, сваког елемента B који је и сам дете или даљи потомак ('//
') елемента A који је дете текућег садржајног чвора (израз не почиње са '/
'). Треба приметити да предикат [1]
тешње одређује него /
оператор. Да би се изабрао први чвор ког одређује израз A//B/*
, треба написати (A//B/*)[1]
. Још треба приметити да, индекси у XPath предикатима (технички, 'удаљености положаја' XPath скупова чворова), почињу од 1, а не од 0, као што је уобичајно у језицима као ћто су C или Јава.
Потпуна Синтакса
Написани потпуном синтаксом, два горенаведена примерa би изгледала овако
/child::A/child::B/child::C
child::A/descendant-or-self::node()/child::B/child::*[position()=1]
Овде је у сваком кораку израза експлицитно наведена оса (нпр. child
или descendant-or-self
), праћена са ::
, а затим са чвор тестом, као што је A
или node()
, из горенаведених примера.
Осни спецификатори
Осни спецификатори указују на правац навигације у оквиру стабла репрезентације XML документа. Осни спецификатори су:
Пуна Синтакса | Скраћена Синтакса | Белешке |
---|---|---|
ancestor | ||
ancestor-or-self | ||
attribute | @ | @abc је скраћеница од attribute::abc |
child | xyz је скраћеница од child::xyz | |
descendant | ||
descendant-or-self | // | // је скраћеница од /descendant-or-self::node()/ |
following | ||
following-sibling | ||
namespace | ||
parent | .. | .. је скраћеница од parent::node() |
preceding | ||
preceding-sibling | ||
self | . | . је скраћеница од self::node() |
Пример коришћења attribute спецификатора у скраћеном синтаксном облику, //a/@href
одабира атрибут који се зове href
у елементу a
било где у стаблу репрезентације документа. Израз . (скраћени запис од self::node()) је најкоришћенији у оквиру предиката и реферише на тренутно изабрани чвор. На пример, h3[.='Pozdravna poruka']
одабира елемент h3
у тренутном контексту, чија текст садржина је Pozdravna poruka
.
Чвор тестови
Чвор тестови могу да се састоје од имена одређених чворова или општије, од израза. У случају XML документа, чији је префикс именског простора gs
дефинисан, //gs:enquiry
ће пронаћи све enquiry
елементе у том именском простору, и //gs:*
ће пронаћи све елементе, не узимајући у обзир локално име, у том именском простору.
Други формати чвор тестова:
- comment()
- проналази XML чвор коментара, на пример
<!-- Komentar -->
- text()
- проналази чвор текстуалног типа, на пример
hello world
у<k>hello<m> world</m></k>
- processing-instruction()
- проналази XML наредбу обраде као што је
<?php echo $a; ?>
. У овом случају,processing-instruction('php')
би одговарало. - node()
- проналази било који чвор из скупа свих чворова.
Предикати
Предикати, записивани као изрази у коцкастим заградама, могу се користити за рестрикцију скупа чворова ради одабира оних за које је одрећени услов испуњен. На пример a[@href='help.php']
ће одабрати оне елементе a
(међу децом контекстног чвора) који имају href
атрибут чија је вредност help.php
.
Не постоји ограничење броја предиката по кораку, и они не морају бити ограничени до последњег корака ()у XPath(). Предикати могу бити угњеждени до било које дубине. Путање наведене у предикатима почињу од контекста текућег корака( на пример од непосредно претходног теста чвора) и не мењају тај контекст. Сви предикати морају бити задовољени да би дошло до ()поклапања().
Када је вредност предиката нумеричка, она се тумачи као тест на позицији чвора. Тако p[1]
одабира прво дете које је p
елемент, док p[last()]
одабира последње.
У другим случајевима, вредност предиката је аутоматски претворена у boolean. Када се изврши провера предиката у скупу чворова, резултат је истинит уколико је скуп одговарајућих чворова непразан. Тако p[@x]
одабира оне p
елементе који имају атрибут именован са x
.
Сложенији пример: израз a[/html/@lang='en'][@href='help.php'][1]/@target
одабира вредности target
атрибута првог a
елемента међу свом децом контекстног чвора који има сопствени href
атрибут постављен на help.php
, омогућујући да елемент највишег нивоа html
такође има и lang
атрибут постављен на en
. Референца на атрибут елемента највишег нивоа у првом предикату не утиче нити на контекст других предиката нити на сам корак лоцирања.
Редослед предиката је битан уколико предикати тестирају позицију чвора. Сваки предикат издваја скуп чворова изабраних у кораку лоцирања. Стога ће a[1][@href='help.php']
пронаћи подударање једино у првом a
детету контекстног чвора које задовољава услов @href='help.php'
, док a[@href='help.php'][1]
пронолази прво a
дете које задовољава овај услов.
Функције и оператори
XPath 1.0 дефинише четири типа података: чвор-скупови, стрингови, бројеви и логички тип.
Постојећи оператори су:
- "/", "//" , "[...]" оператори се користе у описивању путање, на већ приказан начин.
- Оператором унирања, "|", образује се унија два чвор-скупа.
- Логички оператори "and" и "or", и функција "not()"
- Аритметички оператори "+", "-", "*", "div", и "mod"
- Оператори поређења "=", "!=", "<", ">", "<=", ">="
Библиотека функција обухвата:
- Функције за рад са стринговима: concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
- Функције за рад са бројевима: sum(), round(), floor(), ceiling()
- Функције којима се добијају својства чворова: name(), local-name(), namespace-uri()
- Функције којима се добијају информације о контексту обраде: position(), last()
- Претварање типова functions: string(), number(), boolean()
Неке од најкоришћенијих функција су описане испод. За потпун опис погледати[6]
Функције за рад са скуповима чворова
- position()
- враћа број који представља позицију овог чвора у низу чворова који се тренутно обрађују (на пример, чворови одабрани са инструкцијом xsl:for-each instruction у XSLT).
- count(node-set)
- враћа број чворова у скупу чворова прослеђеном као аргумент.
String functions
- string(object?)
- конвертује било који од четири XPath типа података у стринг према предефинисаним правилима. Ако је вредност аргумента чвор-скуп, функција враћа стринг-вредност првог чвора у редоследу документа, игноришући даље чворове.
- concat(string, string, string*)
- спаја два или више стрингова
- starts-with(s1, s2)
- враћа
true
акоs1
започиње саs2
- contains(s1, s2)
- враћа
true
акоs1
садржиs2
- substring(string, start, length?)
- пример:
substring("ABCDEF",2,3)
враћа"BCD"
. - substring-before(s1, s2)
- пример:
substring-before("1999/04/01","/")
враћа1999
- substring-after(s1, s2)
- пример:
substring-after("1999/04/01","/")
враћа04/01
- string-length(string?)
- враћа број карактера у стрингу
- normalize-space(string?)
- белине са крајева бивају уклоњене и сваки низ белина се замењује једним карактером
Буловске функције
- not(boolean)
- негира било који буловски израз.
- true()
- има вредност true.
- false()
- има вредност false.
Бројевне функције
- sum(node-set)
- конвертује све string вредности чворова нађених са XPath
аргументом у бројевима, посштујући правила конверзије за дати систем, и онда враћа
суму ових елемената.
Примери употребе
Изрази се могу креирати унутар предиката коришђењем оператора: =, !=,
<=, <, >=
и : >
. Буловски изрази се
могу комбиновати са заградама ()
и буловским операторима
and
и or
kao i sa not()
функцијом описаном
изнад. За нумеричка израчунавања се користе *, +, -,
div
и mod
. Стрингови се могу
састојати од било којих Unicode карактера.
//item[@price > 2*@discount]
бира ставке чији атрибут цена је већи од
двоструке нумеричке вредности попуста.
Читав скуп чворова се може комбиновати ('unioned')
коришђењем вертикалног 'bar' karaktera |. Скуп чворова који испуњава један или више
услова се могу наћи коришђењем унутар предиката са 'or
'.
v[x or y] | w[z]
ће вратити један скуп чворова који се састоји од свих
v
елемената који имају x
или y
децу
елементе, као и све w
елементе који имају z
) децу
елементе.
Синтакса и семантика(XPath 2.0)
Примери
<?xml version="1.0" encoding="utf-8"?> <wikimedia> <projects> <project name="Wikipedia" launch="2001-01-05"> <editions> <edition language="English">en.wikipedia.org</edition> <edition language="German">de.wikipedia.org</edition> <edition language="French">fr.wikipedia.org</edition> <edition language="Polish">pl.wikipedia.org</edition> <edition language="Spanish">es.wikipedia.org</edition> </editions> </project> <project name="Wiktionary" launch="2002-12-12"> <editions> <edition language="English">en.wiktionary.org</edition> <edition language="French">fr.wiktionary.org</edition> <edition language="Vietnamese">vi.wiktionary.org</edition> <edition language="Turkish">tr.wiktionary.org</edition> <edition language="Spanish">es.wiktionary.org</edition> </editions> </project> </projects> </wikimedia>
XPath израз
- /wikimedia/projects/project/@name
бира name атрибуте за све пројекте, и
- /wikimedia//editions
бира све едиције за све пројекте, и
- /wikimedia/projects/project/editions/edition[@language="English"]/text()
селектује адресе свих Енглеских Wikimedia пројеката(текст свих edition елемената где је language атрибут једнак English). И наредни
- /wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()
бира адресе свих Wikipedia (текст свих edition елемената који постоје под project елементом са name атрибутом Wikipedia)
Имплементација
- Алатке командне линије
- XMLStarlet
- xmllint (libxml2)
- RaptorXML Сервер технологија од Altova подржава XPath 1.0, 2.0, и 3.0
- C/C++
- libxml2
- Pathan[7]
- Sedna XML Database
- VTD-XML
- Xalan
- XQilla[8]
- Јединица XPath је укључена у стандардну библиотеку.
- Имплементације за погон база података
- OpenLink Virtuoso
- Јава
- Saxon XSLT подржава XPath 1.0, XPath 2.0 и XPAth 3.0 (као и са XSLT 2.0, XQuery 3.0, и XPath 3.0)
- BaseX (такоће подржава XPath 2.0 и XQuery)
- VTD-XML
- QuiXPath[9], имплементација за стримовање отвореног кода од стране Innovimax-а
- jQuery XPath наставак[10] заснован на XPath 2.0 имплементацији у јаваскрипту отвореног кода[11]
- Sedna XML Баѕа података
- Perl
- XML::LibXML (libxml2)
- Sedna XML База података
- Пајтон
- libxml2
- Amara
- Sedna XML База података
- lxml
- Ruby
- libxml2[12]
- Nokogiri
- Scheme
- Sedna XML База података
- MySQL подрћжава подскуп XPath од верзије 5.1.5 надаље[13]
- PostgreSQL подржава XPath и XSLT од верзоке 8.4 надаље[14]
- tdom пакет[15] пружа „потпуну, компатибилну и брзу XPath имплементацију у C-у“
Коришћење у шема језицима
XPath се доста користи за изражавање ограничења у шема језицима за XML.
- Шематски језик Schematron, који је сада већ МОС (ISO) стандард, је био пионир тог приступа.
- XPath подскуп за стримовање се користи у W3C XML Schema 1.0 за изражавање једниствености и кључних ограничења. У XSD 1.1, могућности XPath-а су проширене да подржавају условно додељивање типова заснованог на вредностима атрибута, да омогуће да се армитрарне булеанске вредности израчунавају у зависности од садржаја елемената.
- XForms користи XPath да би везао типове за вредности.
- Тај приступ је нашао примену и ван XML апликација, као што је језик ограничења за Јаву назван PMD: Јава се претвара у стабло парсирања налик на DOM, а ѕатим се XPath правила дефинишу над тим стаблом
Види још
- Navigational database
- XLink, XPointer
- XML database
- XSL, XSLT, XSL-FO
Референце
- ^ а б „XML and Semantic Web W3C Standards Timeline” (PDF). 4. 2. 2012. Архивирано из оригинала (PDF) 24. 04. 2013. г. Приступљено 03. 06. 2015.
- ^ Bergeron, Randy (31. 10. 2000). „XPath—Retrieving Nodes from an XML Document”. SQL Server Magazine. Архивирано из оригинала 26. 07. 2010. г. Приступљено 03. 06. 2015.
- ^ Geneves, Pierre (2012). „Course: The XPath Language” (PDF).
- ^ XPath 2.0 подржава атомичке типове, дефинисане као уграђене типове у XML Schema, и може да увезе кориснички дефинисане типове из схеме.
- ^ XPath 3.0 W3C препорука
- ^ „W3C Документацију”. Архивирано из оригинала 09. 12. 2012. г. Приступљено 03. 06. 2015.
- ^ „Pathan”. Архивирано из оригинала 08. 04. 2015. г. Приступљено 03. 06. 2015.
- ^ „XQilla”. Архивирано из оригинала 18. 05. 2015. г. Приступљено 03. 06. 2015.
- ^ QuiXPath
- ^ jQuery XPath наставак
- ^ XPath 2.0 имплементација у Javaskcript
- ^ The XML C parser and toolkit of Gnome
- ^ MySQL :: MySQL 5.1 Reference Manual :: 12.11 XML Functions
- ^ Online docs atpostgresql.org
- ^ „tdom package”. Архивирано из оригинала 03. 06. 2015. г. Приступљено 03. 06. 2015.
Спољашње везе
- XPath 1.0 specification
- XPath 2.0 specification
- XPath 3.0 specification
- XPath 3.1 specification
- What's New in XPath 2.0
- XPath Reference (MSDN)
- XPath Expression Syntax (Saxon)
- XPath 2.0 Expression Syntax (Saxon), [1]
- XPath - MDC Docs Архивирано на сајту Wayback Machine (5. мај 2012) by Mozilla Developer Network
- XPath introduction/tutorial
- XSLT and XPath function reference
- What's new 3.0 Xpath XSLT XSD 1.1