Կրճատված XPath շարահյուսություն: html-ի համար xpath հարցումների օրինակներ՝ օգտագործելով հետևյալ առանցքը

XPath-ը օգտագործվում է XML փաստաթղթի տարրերի և ատրիբուտների միջով նավարկելու համար: XPath-ը W3C XSLT ստանդարտի հիմնական տարրերից մեկն է:

1 Ինչ է պատահել XPath

XPath արտահայտություններ

XPath-ն օգտագործում է ուղու արտահայտություններ՝ XML փաստաթղթում առանձին հանգույցներ կամ հանգույցների մի շարք ընտրելու համար: Այս արտահայտությունները շատ նման են այն արտահայտություններին, որոնք դուք տեսնում եք ավանդական համակարգչային ֆայլային համակարգի հետ աշխատելիս:

Ստանդարտ XPath գործառույթներ

XPath-ը ներառում է ավելի քան 100 ներկառուցված գործառույթ: Կան լարային և թվային արժեքների, ամսաթվի և ժամի, հանգույցների համեմատության և QName մանիպուլյացիայի գործառույթներ, հաջորդականության կառավարում, բուլյան արժեքներ և շատ ավելին:

XPath-ն օգտագործվում է XSLT-ում

XPath-ը XSLT ստանդարտի հիմնական տարրերից մեկն է: Առանց XPath-ի իմացության, դուք չեք կարողանա ստեղծել XSLT փաստաթղթեր:

2 Տերմինաբանություն XPath

Հանգույցներ

XPath-ում կան յոթ տեսակի հանգույցներ՝ տարր, հատկանիշ, տեքստ, անվանատարածք, մշակման հրահանգներ, մեկնաբանություններ և փաստաթղթի հանգույցներ: XML փաստաթղթերը մշակվում են որպես հանգույցների ծառեր: Ծառի վերին տարրը կոչվում է արմատային տարր: Նայեք հետևյալ XML փաստաթղթին.

Հարրի Փոթթեր J. K. Rowling 2005 29.99

Վերևի XML փաստաթղթի հանգույցների օրինակներ.

(արմատային տարր) J. K. Rowling (հանգույց) lang = "hy"(հատկանիշ)

Ատոմային արժեքներ

Ատոմային արժեքները հանգույցներ են, որոնք չունեն երեխաներ կամ ծնողներ: Ատոմային արժեքների օրինակ.

J.K. Rowling «en»

Տարրեր

Տարրերը ատոմային արժեքներ կամ հանգույցներ են:

3 Հարաբերություններհանգույցներ

Ծնող

Յուրաքանչյուր տարր և հատկանիշ ունի մեկ ծնող: Հետևյալ օրինակում գրքի տարրը վերնագրի, հեղինակի, տարվա և գնի տարրերի մայրն է.

Հարրի Փոթթեր Ջեյ Կի Ռոուլինգ 2005 29.99

Հետնորդներ

Տարրերի հանգույցները կարող են ունենալ զրո, մեկ կամ ավելի երեխաներ: Հետևյալ օրինակում «վերնագիր», «հեղինակ», «տարի» և «գին» տարրերը գրքի տարրի զավակներն են.

Հարրի Փոթթեր Ջեյ Կի Ռոուլինգ 2005 29.99

Նույն մակարդակի տարրեր

Սրանք հանգույցներ են, որոնք ունեն նույն ծնողը: Հետևյալ օրինակում «վերնագիր», «հեղինակ», «տարի» և «գին» տարրերը բոլորը նույն մակարդակի տարրեր են.

Հարրի Փոթթեր Ջեյ Կի Ռոուլինգ 2005 29.99

Նախնիներ

Հանգույցի ծնող, հանգույցի ծնող և այլն: Հետևյալ օրինակում վերնագրի տարրի նախահայրերը գրքի և գրախանութի տարրերն են.

Հարրի Փոթթեր Ջեյ Կի Ռոուլինգ 2005 29.99

Հետնորդներ

Հանգույցի երեխաներ, հանգույցի երեխաներ և այլն: Հետևյալ օրինակում «գրախանութ» տարրի երեխաներն են «գիրք», «վերնագիր», «հեղինակ», «տարի» և «գին» տարրերը.

Հարրի Փոթթեր Ջեյ Կի Ռոուլինգ 2005 29.99

4 Շարահյուսություն XPath

XPath-ն օգտագործում է ուղու արտահայտություններ՝ XML փաստաթղթում հանգույցներ կամ հանգույցների հավաքածուներ ընտրելու համար: Հանգույցը կարելի է ընտրել՝ հետևելով ճանապարհին կամ քայլերին: Ստորև բերված օրինակներում մենք կօգտագործենք հետևյալ XML փաստաթուղթը:

Հարրի Փոթթեր 29.99 Սովորելով XML 39.95

Հանգույցի ընտրություն

Օգտագործելով XPath արտահայտությունները XML փաստաթղթում հանգույցներ ընտրելու համար, դուք կարող եք ընտրել հանգույց՝ հետևելով ուղին կամ քայլերին: Ճանապարհի ամենաօգտակար արտահայտությունները թվարկված են ստորև.

Ստորև բերված աղյուսակում թվարկված են արտահայտության որոշ ուղիներ և արտահայտության կատարման արդյունքը.

XPath արտահայտություն Արդյունք
գրախանութ Ընտրում է «գրախանութ» անունով բոլոր հանգույցները
/գրախանութ Ընտրում է գրախանութի արմատային տարրը

Նշում:Եթե ​​ուղին սկսվում է կտրվածքով (/), այն միշտ բացարձակ ճանապարհ է դեպի տարր:

գրախանութ/գիրք Ընտրում է բոլոր «գիրք» տարրերը, որոնք «գրախանութ» տարրի երեխաներ են
//գիրք Ընտրում է բոլոր «գրքի» տարրերը՝ անկախ այն բանից, թե դրանք որտեղ են գտնվում փաստաթղթում
գրախանութ//գրք Ընտրում է բոլոր «գիրք» տարրերը, որոնք «գրախանութ» տարրի զավակներն են՝ անկախ նրանից, թե որտեղ են դրանք «գրախանութ» տարրի տակ։
//@lang Ընտրում է բոլոր հատկանիշները, որոնք կոչվում են «lang»

Պրեդիկատներ

Պրեդիկատները օգտագործվում են որոշակի հանգույց կամ որոշակի արժեք պարունակող հանգույց գտնելու համար: Նախադրյալները միշտ շրջապատված են քառակուսի փակագծերով: Ստորև բերված աղյուսակում թվարկված են մի քանի ուղու արտահայտություններ՝ պրեդիկատներով և արտահայտության արդյունքը.

XPath արտահայտություններ Արդյունք
/գրախանութ/գիրք Ընտրում է առաջին «գիրք» տարրը, որը «գրախանութ» տարրի երեխա է։

Նշում: IE 5,6,7,8,9-ում առաջին հանգույցն ունի ինդեքս, սակայն W3C-ի ուղեցույցների համաձայն՝ այն . Այս խնդիրը IE-ում լուծելու համար սահմանեք «SelectionLanguage» տարբերակը XPath-ի համար.

JavaScript-ում` xml.setProperty ("SelectionLanguage", "XPath");
/գրախանութ/գիրք Ընտրում է վերջին «գիրք» տարրը, որը «գրախանութ» տարրի երեխա է
/գրախանութ/գիրք Ընտրում է նախավերջին «գիրք» տարրը, որը «գրախանութ» տարրի զավակն է
/գրախանութ/գիրք Ընտրելով առաջին երկու «գիրք» տարրերը, որոնք «գրախանութ» տարրի զավակներն են
//վերնագիր[@lang] Ընտրում է բոլոր «վերնագիր» տարրերը, որոնք ունեն «lang» անունով հատկանիշ
//title[@lang="en"] Ընտրում է բոլոր «title» տարրերը, որոնք ունեն «language» հատկանիշ՝ «en» արժեքով:
/գրախանութ/գիրք «Գրախանութ» տարրից հետո ընտրում է բոլոր «գիրք» տարրերը, որոնք ունեն 35,00-ից մեծ արժեք ունեցող «գին» տարր։
/գրախանութ/գիրք/վերնագիր Ընտրում է «գրախանութ» տարրի բոլոր «վերնագիր» տարրերը, որոնք ունեն 35,00-ից մեծ արժեք ունեցող «գին» տարր:

Անհայտ հանգույցների ընտրություն

XPath հատուկ նիշերը կարող են օգտագործվել անհայտ XML հանգույցներ ընտրելու համար:

Ստորև բերված աղյուսակում մենք թվարկել ենք որոշ արտահայտությունների ուղիներ և արտահայտման արդյունքներ.

Ընտրելով բազմաթիվ ուղիներ

Օգտագործելով օպերատորը | XPath արտահայտություններում կարող եք ընտրել մի քանի ուղիներ: Ստորև բերված աղյուսակը թվարկում է մի քանի ուղու արտահայտություններ և դրանց արդյունքները.

5 Առանցքներ XPath

Մենք կօգտագործենք հետևյալ XML փաստաթուղթը ավելի ուշ օրինակում:

Հարրի Փոթթեր 29.99 Սովորելով XML 39.95

Առանցքները սահմանում են հանգույցների հավաքածուներ՝ ընթացիկ հանգույցի համեմատ:

Առանցքի անվանումը Արդյունք
նախահայր Ընտրում է ընթացիկ հանգույցի բոլոր նախնիները (ծնողներ, տատիկներ, պապիկներ և այլն):
նախնի-կամ-ես Ընտրում է ընթացիկ հանգույցի բոլոր նախնիները (ծնողներ, տատիկներ, պապիկներ և այլն) և հենց ներկայիս հանգույցը
հատկանիշ
երեխա
ժառանգ Ընտրում է ընթացիկ հանգույցի բոլոր երեխաներին (երեխաներ, թոռներ և այլն):
ժառանգ-կամ-ես Ընտրում է ընթացիկ հանգույցի բոլոր երեխաներին (երեխաներին, թոռներին և այլն) և հենց ընթացիկ հանգույցին
հետեւելով Ընտրում է ամեն ինչ փաստաթղթում ընթացիկ հանգույցի թեգը փակելուց հետո
հետևորդ-եղբայր Ընտրում է նույն մակարդակի բոլոր հանգույցները ընթացիկ հանգույցից հետո
անվանատարածք Ընտրում է բոլոր հանգույցները ընթացիկ հանգույցի տվյալ անվանատարածքում
ծնող Ընտրում է ընթացիկ հանգույցի մայրը
նախորդող Ընտրում է բոլոր հանգույցները, որոնք հայտնվում են փաստաթղթում ընթացիկ հանգույցից առաջ՝ բացառությամբ նախնիների, հատկանիշի հանգույցների և անվանատարածքի հանգույցների
նախորդող-եղբայր Ընտրում է բոլոր եղբայրներին և քույրերին մինչև ընթացիկ հանգույցը
ինքն իրեն Ընտրում է ընթացիկ հանգույցը

6 Արտահայտություններընմուշառման ուղիներ

Տեղադրության ուղին կարող է լինել բացարձակ կամ հարաբերական: Բացարձակ տեղորոշման ուղին սկսվում է կտրվածքով (/), բայց հարաբերական ճանապարհը՝ ոչ: Երկու դեպքում էլ նմուշառման ուղին բաղկացած է մեկ կամ մի քանի քայլերից, որոնք բաժանված են շեղերով.

Տեղադրության բացարձակ ուղի.

/քայլ/քայլ/...

Հարաբերական տեղադրության առբերման ուղին.

Քայլ/քայլ/...

Յուրաքանչյուր քայլ գնահատվում է ընթացիկ հանգույցի հանգույցների համեմատ: Քայլը բաղկացած է.

  • առանցք (սահմանում է ծառի կապը ընտրված հանգույցների և ընթացիկ հանգույցի միջև);
  • հանգույցի ստուգում (նշում է հանգույցը առանցքի ներսում);
  • զրոյական կամ ավելի պրեդիկատներ (հանգույցների ընտրված հավաքածուն ավելի հստակեցնելու համար)

Բերման քայլի շարահյուսությունը հետևյալն է.

Axisname::nodetestAxisname::nodetest[կանխատեսող]

Օրինակ Արդյունք
երեխա::գիրք Ընտրում է գրքի բոլոր հանգույցները, որոնք ընթացիկ հանգույցի երեխաներ են
հատկանիշ:: lang Ընտրում է ընթացիկ հանգույցի լեզվի հատկանիշը (lang):
երեխա ::* Ընտրում է ընթացիկ հանգույցի բոլոր երեխաներին
հատկանիշ::* Ընտրում է ընթացիկ հանգույցի բոլոր ատրիբուտները
երեխա::տեքստ () Ընտրում է ընթացիկ հանգույցի բոլոր տեքստային հանգույցները
երեխա::հանգույց () Ընտրում է ընթացիկ հանգույցի բոլոր անմիջական երեխաներին
հետնորդ::book Ընտրում է ընթացիկ հանգույցի բոլոր երեխաներին
նախահայր::գիրք Ընտրում է ընթացիկ հանգույցի «գրքերի» բոլոր նախնիները
նախնի-կամ-ես::գիրք Ընտրում է ընթացիկ հանգույցի բոլոր գրքի նախնիները, և ընթացիկ հանգույցը, եթե այն նույնպես գիրք է
երեխա::*/երեխա::գին Ընտրում է «գնի» բոլոր զավակները ընթացիկ հանգույցից մեկ մակարդակ հեռավորության վրա

7 Օպերատորներ XPath

XPath արտահայտությունները վերադառնում են որպես հանգույցների, տողերի, բուլյանների կամ թվային արժեքների հավաքածու: Ստորև բերված է XPath արտահայտություններում օգտագործվող օպերատորների ցանկը.

Օպերատոր Նկարագրություն Օրինակ
| Հաշվում է հանգույցների երկու խումբ //գիրք | //cd
+ Հավելում 6 + 4
- Հանում 6 - 4
* Բազմապատկում 6 * 4
դիվ Բաժանում 8 բաժին 4
= Հավասարություն գինը=9.80
!= Անհավասարություն գինը!=9,80
< Ավելի քիչ քան գինը<9.80
<= Պակաս կամ հավասար գինը≤9.80
> Ավելի քան գինը> 9,80
>= Ավելի կամ հավասար գինը≤9.80
կամ Կամ գին=9,80 կամ գին=9,70
և ԵՎ գինը> 9.00 և գինը<9.90
ռեժիմ Բաժանման մնացորդը 5 ռեժիմ 2

8 Օրինակներ XPath

Եկեք անցնենք հիմնական XPath շարահյուսությունը մի քանի օրինակներով: Ստորև բերված օրինակներում մենք կօգտագործենք հետևյալ XML փաստաթուղթը «books.xml».

Ամենօրյա իտալերեն Ջիադա Դե Լաուրենտիս 2005 30.00 Հարրի Փոթթեր Ջեյ Կի Ռոուլինգ 2005 29.99 XQuery Kick Start Ջեյմս ՄակԳովերն Պեր Բոթներ Կուրտ Քեյգլ Ջեյմս Լին Վայդյանաթան Նագարաջան 2003 49.99 Սովորելով XML Էրիկ Թ. Ռեյ 2003 39.95

XML փաստաթղթի բեռնում

Օգտագործեք XMLHttpRequest՝ XML փաստաթղթերը ներբեռնելու համար, որն աջակցվում է ժամանակակից բրաուզերների մեծ մասի կողմից.

Var xmlhttp=նոր XMLHttpRequest()

Microsoft-ի հին բրաուզերների կոդ (IE 5 և 6).

Var xmlhttp=new ActiveXObject(«Microsoft.XMLHTTP»)

Հանգույցի ընտրություն

Ցավոք, XPath-ը կարող է տարբեր կերպ աշխատել Internet Explorer-ում, քան այլ բրաուզերներում: Մեր օրինակներում մենք կօգտագործենք կոդը, որը պետք է աշխատի բրաուզերների մեծ մասում: Internet Explorer-ը օգտագործում է «selectNodes()» մեթոդը՝ XML փաստաթղթում հանգույցներ ընտրելու համար.

XmlDoc.selectNodes (xpath);

Firefox-ը, Chrome-ը, Opera-ն և Safari-ն օգտագործում են գնահատում() մեթոդը՝ XML փաստաթղթից հանգույցներ ընտրելու համար.

XmlDoc.evaluate (xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);

Ընտրեք բոլոր վերնագրերը

Հետևյալ օրինակը ընտրում է վերնագրի բոլոր հանգույցները.

/գրախանութ/գիրք/վերնագիր

Ընտրելով առաջին գրքի վերնագիրը

Հետևյալ օրինակը ընտրում է «գրախանութ» տարրից հետո առաջին «գիրք» հանգույցի անվանումը.

/գրախանութ/գիրք/վերնագիր

Ընտրեք բոլոր գները

Հետևյալ օրինակը ընտրում է բոլոր գնային հանգույցների տեքստը.

/գրախանութ/գիրք/գին

Ընտրում է >35 գնով հանգույցներ

Հետևյալ օրինակը ընտրում է 35-ից բարձր գներով բոլոր հանգույցները.

/գրախանութ/գիրք/գին

Վերնագրի հանգույցների ընտրություն >35 գնով

Հետևյալ օրինակը ընտրում է 35-ից մեծ արժեք ունեցող բոլոր վերնագրի հանգույցները.

/գրախանութ/գիրք/վերնագիր

Xpath-ը հարցման լեզու է xml կամ xhtml փաստաթղթի տարրերի համար: Ճիշտ այնպես, ինչպես SQL-ն, xpath-ը հարցման դեկլարատիվ լեզու է: Հետաքրքրվող տվյալները ստանալու համար պարզապես անհրաժեշտ է ստեղծել հարցում, որը նկարագրում է այս տվյալները: Xpath լեզվի թարգմանիչը ձեզ համար կանի բոլոր կեղտոտ աշխատանքը:
Շատ հարմար է, այնպես չէ՞։ Տեսնենք, թե ինչ հնարավորություններ է առաջարկում xpath-ը վեբ էջի հանգույցներ մուտք գործելու համար:

Վեբ էջի հանգույցների հարցումների ստեղծում

Ձեր ուշադրությանն եմ ներկայացնում մի փոքրիկ լաբորատոր աշխատանք, որի ընթացքում ես կցուցադրեմ xpath հարցումների ստեղծումը վեբ էջ: Դուք կկարողանաք կրկնել իմ տված խնդրանքները և, որ ամենակարեւորն է, փորձեք կատարել ձերը։ Հուսով եմ, որ դրա շնորհիվ հոդվածը նույնքան հետաքրքիր կլինի սկսնակների և ծրագրավորողների համար, ովքեր ծանոթ են xpath to xml-ին:

Լաբորատորիայի համար մեզ անհրաժեշտ կլինի.
- xhtml վեբ էջ;
- Mozilla Firefox բրաուզեր հավելումներով;
- firebug;
- firePath;
(դուք կարող եք օգտագործել ցանկացած այլ զննարկիչ՝ տեսողական xpath աջակցությամբ)
- մի քիչ ժամանակ:

Որպես փորձի անցկացման վեբ էջ՝ առաջարկում եմ World Wide Web Consortium կայքի գլխավոր էջը («http://w3.org»): Հենց այս կազմակերպությունն է մշակում xquery(xpath) լեզուները, xhtml հստակեցումը և ինտերնետի բազմաթիվ այլ ստանդարտներ:

Առաջադրանք
Ստացեք կոնսորցիումի կոնֆերանսների մասին տեղեկատվություն w3.org գլխավոր էջի xhtml կոդից՝ օգտագործելով xpath հարցումները:
Սկսենք գրել xpath հարցումներ։
Առաջին Xpath հարցումը
Բացեք Firepath ներդիրը FireBug-ում, ընտրեք այն տարրը, որը պետք է վերլուծվի ընտրիչով, սեղմեք. Firepath-ը ստեղծել է xpath հարցում ընտրված տարրի համար:

Եթե ​​ընտրել եք առաջին իրադարձության անվանումը, ապա հարցումը կլինի այսպիսին.

Ավելորդ ինդեքսները հեռացնելուց հետո հարցումը կհամապատասխանի վերնագրի տիպի բոլոր տարրերին:

Firepath-ը ընդգծում է հարցմանը համապատասխանող տարրեր: Դուք կարող եք իրական ժամանակում տեսնել, թե որ փաստաթղթի հանգույցները համապատասխանում են հարցմանը:

Համաժողովների անցկացման վայրերի մասին տեղեկատվության հարցում.
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Այսպես մենք ստանում ենք հովանավորների ցուցակը.
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

xpath շարահյուսություն

Եկեք վերադառնանք մեր ստեղծած հարցումներին և հասկանանք, թե ինչպես են դրանք կառուցված:
Եկեք մանրամասն քննարկենք առաջին խնդրանքը

Այս հարցման մեջ ես բաժանել եմ երեք մաս՝ xpath-ի հնարավորությունները ցուցադրելու համար: (Մասերի բաժանումը բարդ է)

Առաջին մաս
.// - ռեկուրսիվ անկում դեպի հիերարխիայի զրոյական կամ ավելի մակարդակներ ընթացիկ համատեքստից: Մեր դեպքում ներկայիս համատեքստը փաստաթղթի արմատն է

Երկրորդ մաս
* - ցանկացած տարր,
[@id="w3c_home_upcoming_events"]– պրեդիկատ, որի հիման վրա մենք փնտրում ենք հանգույց, որն ունի «w3c_home_upcoming_events» հավասար id հատկանիշ: XHTML տարրերի ID-ները պետք է եզակի լինեն: Հետևաբար, «ցանկացած տարր հատուկ ID-ով» հարցումը պետք է վերադարձնի միակ հանգույցը, որը մենք փնտրում ենք:

Մենք կարող ենք փոխարինել * դեպի ճշգրիտ հանգույցի անունը դիվայս խնդրանքում
div[@id="w3c_home_upcoming_events"]

Այսպիսով, մենք իջնում ​​ենք փաստաթղթերի ծառից մինչև մեզ անհրաժեշտ div[@id="w3c_home_upcoming_events"] հանգույց: Մեզ բոլորովին չի հետաքրքրում, թե ինչ հանգույցներից է բաղկացած DOM ծառը և քանի մակարդակի հիերարխիա է մնում վերևում։

Երրորդ մասը
/ul/li/div/p/a–xpath-ը կոնկրետ տարրի ուղին է: Ճանապարհը բաղկացած է հասցեավորման քայլերից և հանգույցների ստուգման պայմաններից (ul, li և այլն): Քայլերը բաժանվում են «/» (շեղ) նիշով:

xpath հավաքածուներ
Միշտ չէ, որ հնարավոր է մուտք գործել հետաքրքրող հանգույց՝ օգտագործելով պրեդիկատ կամ հասցեավորման քայլեր: Շատ հաճախ մեկ հիերարխիայի մակարդակում կան նույն տեսակի բազմաթիվ հանգույցներ, և անհրաժեշտ է ընտրել «միայն առաջինը» կամ «միայն երկրորդը»: Նման դեպքերի համար նախատեսված են հավաքածուներ։

xpath հավաքածուները թույլ են տալիս մուտք գործել տարր իր ինդեքսով: Ցուցանիշները համապատասխանում են այն հերթականությանը, որով տարրերը ներկայացվել են բնօրինակ փաստաթղթում: Հավաքածուներում սերիական համարը հաշվվում է մեկից:

Ելնելով այն հանգամանքից, որ «վայրը» միշտ երկրորդ պարբերությունն է «կոնֆերանսի անվանումից» հետո, մենք ստանում ենք հետևյալ հարցումը.
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p
Որտեղ p-ը հավաքածուի երկրորդ տարրն է /ul/li/div-ի յուրաքանչյուր հանգույցի համար:

Նմանապես, մենք կարող ենք ստանալ հովանավորների ցանկ՝ խնդրանքով.
.//*[@id="w3c_home_upcoming_events"]/ul/li/div/p

Որոշ xpath գործառույթներ
Xpath-ում կան բազմաթիվ գործառույթներ հավաքածուի մեջ տարրերի հետ աշխատելու համար: Ես կտամ դրանցից միայն մի քանիսը։

վերջին ():
Վերադարձնում է հավաքածուի վերջին տարրը:
Հարցում ul/li/div/p - կվերադարձնի վերջին պարբերությունները «ul» ցուցակի յուրաքանչյուր հանգույցի համար:
Առաջին() ֆունկցիան տրամադրված չէ: Առաջին տարր մուտք գործելու համար օգտագործեք «1» ինդեքսը:

text():
Վերադարձնում է տարրի փորձնական բովանդակությունը:
.//a – մենք ստանում ենք բոլոր հղումները «Արխիվ» տեքստով:

դիրք () և mod:
position() - վերադարձնում է տարրի դիրքը բազմությունում:
mod-ը բաժանման մնացորդն է:

Այս գործառույթները համադրելով մենք կարող ենք ստանալ.
- նույնիսկ ոչ էլ տարրեր ul/li
- զույգ տարրեր՝ ul/li

Համեմատության գործողություններ

  • < - логическое «меньше»
  • > - տրամաբանական «ավելի քան»
  • <= - логическое «меньше либо равно»
  • >= - տրամաբանական «մեծ կամ հավասար»
ul/li , ul/li - թվարկել տարրերը սկսած 3-րդ թվից եւ հակառակը։

Ինքնուրույն

Փորձեք ստանալ.
- նույնիսկ URL հղումներ «Ստանդարտներ» ձախ մենյուից;
- բոլոր նորությունների վերնագրերը, բացառությամբ w3c.org-ի գլխավոր էջից առաջինի:

Xpath-ը PHP5-ում

$dom = նոր DomDocument(); $dom->loadHTML ($HTMLCode); $xpath = նոր DomXPath ($dom); $_res = $xpath-> հարցում (".//*[@id="w3c_home_upcoming_events"]/ul/li/div/p/a"); foreach ($_res => $obj) ( echo "URL: ".$obj->getAttribute("href"); echo $obj->nodeValue;)

Վերջապես

Օգտագործելով պարզ օրինակ՝ մենք տեսանք xpath-ի հնարավորությունները վեբ էջի հանգույցներ մուտք գործելու համար:
Xpath-ը xml տարրեր և xhtml, xslt փոխակերպումներ մուտք գործելու արդյունաբերական ստանդարտ է:
Դուք կարող եք օգտագործել այն ցանկացած html էջ վերլուծելու համար: Եթե ​​սկզբնաղբյուր html կոդը պարունակում է զգալի սխալներ նշագրման մեջ, գործարկեք այն

Այսօր մենք ավելի մանրամասն կանդրադառնանք XPath-ի PHP-ով օգտագործելու թեմային: Օրինակներում կտեսնեք, թե ինչպես է XPath-ը զգալիորեն նվազեցնում կոդերի քանակը: Եկեք նայենք XPath-ում հարցումների և գործառույթների օգտագործմանը:

Սկզբում ես ձեզ կներկայացնեմ երկու տեսակի փաստաթղթեր՝ DTD և XML, որոնց միջոցով մենք կանդրադառնանք PHP DOM XPath-ի աշխատանքին: Ահա թե ինչ տեսք ունեն նրանք.

Գիրք Հեղինակ Սարսափ գլուխ առաջին Մեկ այլ Գիրք Մեկ այլ հեղինակ Գիտաֆանտաստիկա գլուխ առաջին

Հիմնական XPath հարցումներ

Պարզ XPath շարահյուսությունը թույլ է տալիս մուտք գործել XML փաստաթղթի տարրեր: Ամենապարզ ձևով կարող եք նշել ցանկալի տարրի ուղին: Օգտագործելով վերը ներկայացված XML փաստաթուղթը, հետևյալ XPath հարցումը կվերադարձնի գրքի տարրում հայտնաբերված ընթացիկ տարրերի հավաքածուն.

//գրադարան/գիրք

Սրա նման! Երկու առաջ շեղերը սահմանում են փաստաթղթի արմատային տարրը, և մեկ առաջ կտրվածքով անցնում է գրքի երեխա տարրին: Դա պարզ է և արագ, այնպես չէ՞:

Բայց ինչ անել, եթե ցանկանում եք ընտրել որոշակի գրքի տարր հավաքածուից: Ենթադրենք, որ դուք ուզում եք «որոշ հեղինակի» գրքեր։ Դրա համար XPath հարցումը կլինի.

//գրադարան/գիրք/հեղինակ/..

դուք կարող եք օգտագործել տեքստ ()քառակուսի փակագծերում՝ համեմատելու հանգույցի արժեքը: Նաև «/..» նշանակում է, որ մենք ցանկանում ենք օգտագործել մայր տարրը (այսինքն՝ վերադառնալ մեկ հանգույց վերևում):

XPath հարցումները կատարվում են օգտագործելով մեկ կամ երկու գործառույթ. հարցում ()Եվ գնահատել (). Երկուսն էլ կազմում են հարցում, բայց տարբերությունը վերադարձված արդյունքի մեջ է: query() միշտ կվերադառնա DOMNodeList, Ի տարբերություն գնահատել ()հնարավորության դեպքում կվերադարձնի տեքստային արդյունք: Օրինակ, եթե ձեր XPath հարցումը կվերադարձնի որոշակի հեղինակի կողմից գրված գրքերի քանակը, ապա query()-ը կվերադարձնի դատարկ DOMNodeList, գնահատում()-ը պարզապես կվերադարձնի մի թիվ, դուք կարող եք ուղղակիորեն օգտագործել սա՝ տվյալներ հանգույցից առբերելու համար: .

XPath կոդը և արագության առավելությունները

Դիտարկենք մի պարզ օրինակ, որը կվերադարձնի կոնկրետ հեղինակի գրած գրքերի քանակը: Մենք կդիտարկենք առաջին մեթոդը այնպես, ինչպես միշտ, առանց XPath-ի օգտագործման: Այժմ դուք կհասկանաք, թե ինչպես դա անել առանց XPath-ի և որքան ավելի հեշտ է դա անել XPath-ով:

domDocument->getElementsByTagName("հեղինակ"); foreach ($elements որպես $element) ( if ($element->nodeValue == $author) ( $total++; ) ) վերադարձնել $number; )

Հաջորդ մեթոդը վերադարձնում է նույն արդյունքը, սակայն օգտագործում է XPath՝ ընտրելու այն գրքերը, որոնք գրված են կոնկրետ հեղինակի կողմից:

domDocument); $result = $xpath-> հարցում ($query); վերադարձ $result->length; )

Նկատի ունեցեք, որ մենք կարիք չունենք նորից ստուգելու յուրաքանչյուր տարրի արժեքը՝ որոշելու համար, թե որ հեղինակն է գրել յուրաքանչյուր գիրք: Բայց մենք կարող ենք ավելի պարզեցնել կոդը՝ օգտագործելով XPath ֆունկցիան հաշվել ()հաշվել այս ճանապարհի տարրերի պարունակությունը:

domDocument); վերադարձնել $xpath->գնահատել ($ հարցում); )

Մենք կարող ենք մեզ անհրաժեշտ տեղեկատվությունը ստանալ մեկ տողով XPath հարցումով: Շատ PHP ֆիլտրեր ստեղծելու կարիք չկա։ Սա այս ֆունկցիոնալությունը գրելու ամենահեշտ և ամենաարագ ձևն է:

Նկատի ունեցեք, որ value()-ն օգտագործվել է վերջին օրինակում: Դա պայմանավորված է նրանով, որ count() ֆունկցիան վերադարձնում է տեքստային արդյունք: Query()-ի օգտագործումը կվերադարձնի DOMNodeList, բայց այն դատարկ կլինի:

XPath-ն արժե օգտագործել, քանի որ այն ոչ միայն հեշտացնում է ձեր PHP կոդը, այլ նաև արագության առավելություն է տալիս: Նկատեցի, որ առաջին տարբերակը միջինում 30%-ով ավելի արագ էր երկրորդի համեմատ։ Բայց երրորդը 10%-ով ավելի արագ է, քան առաջինը: Իհարկե, դա կախված է ձեր սերվերից և ձեր օգտագործած հարցումներից: XPath-ի օգտագործումն իր մաքուր ձևով տալիս է առավելագույն արդյունքներ կոդ գրելու արագությամբ և հեշտությամբ:

XPath գործառույթները

Ահա մի քանի գործառույթներ, որոնք կարող են օգտագործվել XPath-ի հետ: Դուք նաև կգտնեք բազմաթիվ ռեսուրսներ, որոնք մանրամասնում են յուրաքանչյուր հասանելի հատկանիշի մասին: Եթե ​​Ձեզ անհրաժեշտ է հաշվարկել DOMNodeList-ը կամ համեմատել nodeValue-ը (հանգույցի արժեքը), կարող եք գտնել համապատասխան XPath ֆունկցիա, որը վերացնում է անհարկի PHP կոդի օգտագործումը:

Սա արդեն գիտեք count() ֆունկցիայի օրինակից։ Տրված ISBN-ներով գրքերի վերնագրերը ստանալու համար օգտագործենք id() ֆունկցիան։ Դա անելու համար դուք պետք է օգտագործեք հետևյալ XPath արտահայտությունը.

id ("isbn1234 isbn1235")/վերնագիր

Նկատի ունեցեք, որ ձեր փնտրած արժեքները չպետք է փակվեն փակագծերի մեջ, պարզապես դրանք բաժանվեն բացատներով: Բացի այդ, նույնիսկ մի մտածեք ստորակետ ավելացնելու մասին.

domDocument); $result = $xpath-> հարցում ($query); $գրքեր = զանգված(); foreach ($result որպես $node) ( $book = array ("title" => $booknode->nodeValue); $books = $book; ) վերադարձնել $books; )

XPath-ում բարդ գործառույթների կառավարումը աներևակայելի պարզ է:

PHP ֆունկցիաների օգտագործումը XPath-ի հետ

Երբեմն ձեզ անհրաժեշտ կլինի ավելի շատ ֆունկցիոնալություն, որը ստանդարտ XPath գործառույթները չեն կարող ապահովել: Բարեբախտաբար, PHP DOM-ը թույլ է տալիս հայրենի PHP գործառույթներին փոխազդել XPath հարցումների հետ:

Դիտարկենք մի օրինակ, որը վերադարձնում է գրքի վերնագրի բառերի քանակը: Այս ամենապարզ գործառույթում մենք կգրենք հետևյալը.

domDocument); $result = $xpath-> հարցում ($query); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; վերադարձնել str_word_count ($title); )

Բայց մենք կարող ենք նաև ներառել str_word_count() ֆունկցիան անմիջապես XPath հարցումում: Դա կարելի է անել մի քանի քայլով: Առաջին հերթին մենք պետք է գրանցենք անվանատարածք XPath օբյեկտով: XPath հարցումներում PHP ֆունկցիաները կանչվում են «php:functionString» տողի միջոցով, որից հետո գրվում է ցանկալի ֆունկցիայի անունը։ Նաև անունների տարածությունը ավելի մանրամասն քննարկվում է http://php.net/xpath կայքում: Անվանատարածքի այլ արժեքները սխալ կառաջացնեն: Դրանից հետո մենք պետք է կանչենք registerPHPFunctions(): Այս ֆունկցիան ասում է PHP-ին, որ երբ զանգ է կատարվում «php:» անվանատարածքի միջոցով, PHP-ն կկարգավորի այս զանգը:

Ֆունկցիաներ կանչելու օրինակ շարահյուսությունը կլինի.

php:functionString ("nameoffunction", arg, arg...)

Եկեք այդ ամենը միասին հավաքենք հետևյալ getNumberOfWords() ֆունկցիայի օրինակում.

domDocument); //register php namespace $xpath->registerNamespace ("php", "http://php.net/xpath"); //այժմ php ֆունկցիաները կարող են կանչվել xpath հարցումներում $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/վերնագիր)"; վերադարձնել $xpath->գնահատել ($ հարցում); )

Նկատի ունեցեք, որ հանգույցի տեքստը ստանալու համար ձեզ հարկավոր չէ զանգահարել XPath ֆունկցիայի տեքստը(): RegisterPHPFunctions() մեթոդը սա դարձնում է ավտոմատ: Թեև կոդերի հետևյալ օրինակ տողը նույնպես վավեր կլինի.

php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/title))

PHP գործառույթների գրանցումը չի սահմանափակվում PHP-ում ներառված գործառույթներով: Դուք կարող եք սահմանել ձեր սեփական գործառույթները և օգտագործել դրանք XPath-ի ներսում: Միակ տարբերությունն այն է, որ դուք պետք է օգտագործեք «php:function»-ը «php:functionString»-ի փոխարեն:

Եկեք դասարանից դուրս ֆունկցիա գրենք՝ հիմնական ֆունկցիոնալությունը ցույց տալու համար: Ֆունկցիան, որը մենք կօգտագործենք, վերադարձնում է «Ջորջ Օրուելի» հեղինակի գրքերը։ Այն պետք է վերադարձնի true յուրաքանչյուր հանգույցի համար, որը ցանկանում եք ներառել հարցումում:

nodeValue == «(!ԼԵԶԱՆ՝ Ջորջ Օրուել"; } !}

Գործառույթին փոխանցված արգումենտը DOM տարրերի զանգված է: Այս ֆունկցիան անցնում է զանգվածով և որոշում է անհրաժեշտ տարրերը, այնուհետև դրանք ներառում է DOMNodeList-ում։ Այս օրինակում փորձարկվող հանգույցը /book-ն էր, և մենք նաև օգտագործեցինք /author-ը՝ պահանջվող տարրերը որոշելու համար:

Այժմ մենք կարող ենք ստեղծել getGeorgeOrwellBooks() ֆունկցիան.

domDocument); $xpath->registerNamespace ("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//գրադարան/գիրք1"; $result = $xpath-> հարցում ($query); $գրքեր = զանգված(); foreach($result as $node) ( $books = $node->getElementsByTagName("title") ->item(0)->nodeValue; ) վերադարձնել $books; )

Եթե ​​compare() ֆունկցիան ստատիկ է, ապա դուք պետք է փոփոխեք XPath հարցումը.

//գրադարան/գիրք

Անկեղծ ասած, այս ամբողջ ֆունկցիոնալությունը կարող էր իրականացվել՝ օգտագործելով մաքուր XPath կոդը: Բայց օրինակը ցույց է տալիս, թե ինչպես կարող եք ընդլայնել XPath հարցումները և դրանք ավելի բարդացնել:

Եզրափակելով

XPath XML-ի հետ աշխատելիս կոդի քանակը նվազեցնելու և դրա մշակումը մեծացնելու հիանալի միջոց է: Լրացուցիչ PHP DOM ֆունկցիոնալությունը թույլ է տալիս ընդլայնել XPath գործառույթները: Սա իսկապես օգտակար բան է, եթե այն օգտագործես ու խորամուխ եղիր կոնկրետությունների մեջ, ստիպված կլինես գնալով ավելի քիչ կոդ գրել։


XPath-ը օգտագործում է ուղու արտահայտություններ՝ XML փաստաթղթում կամ հանգույցների մի շարք հանգույցներ ընտրելու համար: Ընտրված ուղու (ուղու) կամ փուլի (քայլերի) երկայնքով հանգույցով:

օրինակ XML փաստաթղթեր

Մենք կօգտագործենք այս XML փաստաթուղթը ստորև բերված օրինակներում:


Հարրի Փոթթեր
29.99


Սովորելով XML
39.95

Ընտրեք հանգույց

XPath-ն օգտագործում է ուղու արտահայտություններ՝ XML փաստաթղթում հանգույցներ ընտրելու համար: Կամ ուղու երկայնքով հանգույցի միջով քայլ ընտրելու համար: Ամենաօգտակար ուղու արտահայտությունները թվարկված են ստորև.

Ստորև բերված աղյուսակում մենք ցույց ենք տալիս արտահայտության որոշ ուղիներ և արտահայտության արդյունքը.

Արտահայտություն Ուղինարդյունք
գրքի խանութԸնտրեք գրքի տարրի բոլոր մանկական հանգույցները:
/ Գրքի խանութ

Ընտրեք արմատային տարրի գրախանութը:

Նշում. Եթե ուղին սկսվում է կտրվածքով (/), ուղին միշտ ներկայացնում է տարրի բացարձակ ուղին:

գրախանութ/գիրքԸնտրեք գրախանութին պատկանող ենթակետերը բոլոր գրքույկները:
// ԳիրքԸնտրեք գրքի բոլոր ենթատարրերը՝ անկախ փաստաթղթում նրանց դիրքից:
գրախանութ // գիրքԸնտրում է գրքի բոլոր տարրերը, որոնք չեն հանդիսանում տարրի գրախանութի ժառանգները՝ անկախ գրախանութում և գրախանութում իրենց դիրքից:
// @LangԸնտրեք Lang անունով բոլոր հատկությունները:

Պրեդիկատ(ներ)

Պրեդիկատը օգտագործվում է որոշակի հանգույց կամ հանգույց գտնելու համար, որը պարունակում է նշված արժեքը:

Նախադրյալը փակցված է քառակուսի փակագծերում։

Ստորև բերված աղյուսակում մենք թվարկել ենք մի քանի ուղու արտահայտություններ պրեդիկատներով և արտահայտության արդյունքը.

Արտահայտություն Ուղինարդյունք
/ Գրախանութ / գիրքԸնտրեք ենթատարրերը, որոնք պատկանում են աշխատանքային գրքի առաջին տարրին:
/Գրախանութ/գիրք [վերջին()]Ընտրեք ենթատարրերը, որոնք պատկանում են գրքի վերջին գրքի տարրին:
/ Գրախանութ / գիրք [վերջին () - 1]Ընտրեք երկրորդ գրքի փոխադարձ գրախանութին վերաբերող ենթակետերը։
/Գրախանութ/գիրք [դիրք()<3] Ընտրեք ենթատարրերին պատկանող գրքի տարրի առաջին երկու գրքային տարրերը:
// Վերնագիր [@lang]Ընտրեք բոլոր հատկանիշը, որը կոչվում է Lang, ունի տարրի վերնագիր:
// Վերնագիր [@ LANG = «eng»]Ընտրեք բոլոր տարրերի անունները, և այդ տարրերն ունեն անգլերեն հատկանիշի արժեքը:
/գրախանութ/գիրքԸնտրեք գրքի տարրի բոլոր գրքային տարրերը և գնային տարրի արժեքը, որը պետք է լինի 35,00-ից մեծ:
/գրախանութ/գիրք/վերնագիրԸնտրեք գրքի տարրի վերնագրի բոլոր տարրերը, որոնցում գնային տարրի արժեքը պետք է լինի 35,00-ից մեծ:

Ընտրեք անհայտ հանգույցներ

XPath wildcards-ը կարող է օգտագործվել անհայտ XML տարրեր ընտրելու համար:

Ստորև բերված աղյուսակում մենք թվարկել ենք որոշ ճանապարհային արտահայտություններ, ինչպես նաև այս արտահայտությունների արդյունքները.

Ընտրեք բազմաթիվ ուղիներ

Օգտագործելով «|» ուղու արտահայտությունը օպերատոր, դուք կարող եք ընտրել մի քանի ուղիներ:

Ստորև բերված աղյուսակում մենք թվարկել ենք որոշ ճանապարհային արտահայտություններ, ինչպես նաև այս արտահայտությունների արդյունքները: