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.) постоје као део „погона“.
XPath израз иксоришћен над XML датотеком

Синтакса и семантика (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 или Јава.

Потпуна Синтакса[уреди]

Написани потпуном синтаксом, два горе наведена пример би изгледала овако

  • /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)

Имплементација[уреди]

Алатке командне линије
ActionScript
C/C++
Delphi
Free Pascal
  • Јединица XPath је укључена у стандардну библиотеку.
Имплементације за погон база података
Јава
  • 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-а


JavaScript
  • jQuery XPath наставак [10] заснован на XPath 2.0 имплементацији у јаваскрипту отвореног кода[11]
.NET Framework
Perl
PHP
Пајтон
Ruby
Scheme
SQL
  • MySQL подрћжава подскуп XPath од верзије 5.1.5 надаље[13]
  • PostgreSQL подржава XPath и XSLT од верзоке 8.4 надаље[14]
Tcl
  • tdom пакет[15] пружа „потпуну, компатибилну и брзу XPath имплементацију у C-у“

Коришћење у шема језицима[уреди]

XPath се доста користи за изражавање ограничења у шема језицима за XML.

  • Шематски језик Schematron, који је сада већ МОС (ISO) стандард, је био пионир тог приступа.
  • XPath подскуп за стримовање се користи у W3C XML Schema 1.0 за изражавање једниствености и кључних ограничења. У XSD 1.1, могућности XPath-а су проширене да подржавају условно додељивање типова заснованог на вредностима атрибута, да омогуће да се армитрарне булеанске вредности израчунавају у зависности од садржаја елемената.
  • XForms користи XPath да би везао типове за вредности.
  • Тај приступ је нашао примену и ван XML апликација, као што је језик ограничења за Јаву назван PMD: Јава се претвара у стабло парсирања налик на DOM, а ѕатим се XPath правила дефинишу над тим стаблом

Види још[уреди]

Референце[уреди]

  1. 1,0 1,1 „XML and Semantic Web W3C Standards Timeline” (PDF). 4. 2. 2012. 
  2. ^ Bergeron, Randy (31. 10. 2000). „XPath—Retrieving Nodes from an XML Document”. SQL Server Magazine. Архивирано из оригинала на датум 26. 07. 2010. Приступљено 03. 06. 2015. 
  3. ^ Geneves, Pierre (2012). „Course: The XPath Language” (PDF). 
  4. ^ XPath 2.0 подржава атомичке типове, дефинисане као уграђене типове у XML Schema, и може да увезе кориснички дефинисане типове из схеме.
  5. ^ XPath 3.0 W3C препорука
  6. ^ W3C Документацију
  7. ^ „Pathan”. Архивирано из оригинала на датум 08. 04. 2015. Приступљено 03. 06. 2015. 
  8. ^ XQilla
  9. ^ QuiXPath
  10. ^ jQuery XPath наставак
  11. ^ XPath 2.0 имплементација у Javaskcript
  12. ^ The XML C parser and toolkit of Gnome
  13. ^ MySQL :: MySQL 5.1 Reference Manual :: 12.11 XML Functions
  14. ^ Online docs atpostgresql.org
  15. ^ „tdom package”. Архивирано из оригинала на датум 03. 06. 2015. Приступљено 03. 06. 2015. 

Спољашње везе[уреди]