Կրճատված 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 փաստաթղթին.
Վերևի XML փաստաթղթի հանգույցների օրինակներ.
Ատոմային արժեքներ
Ատոմային արժեքները հանգույցներ են, որոնք չունեն երեխաներ կամ ծնողներ: Ատոմային արժեքների օրինակ.
J.K. Rowling «en»
Տարրեր
Տարրերը ատոմային արժեքներ կամ հանգույցներ են:
3 Հարաբերություններհանգույցներ
Ծնող
Յուրաքանչյուր տարր և հատկանիշ ունի մեկ ծնող: Հետևյալ օրինակում գրքի տարրը վերնագրի, հեղինակի, տարվա և գնի տարրերի մայրն է.
Հետնորդներ
Տարրերի հանգույցները կարող են ունենալ զրո, մեկ կամ ավելի երեխաներ: Հետևյալ օրինակում «վերնագիր», «հեղինակ», «տարի» և «գին» տարրերը գրքի տարրի զավակներն են.
Նույն մակարդակի տարրեր
Սրանք հանգույցներ են, որոնք ունեն նույն ծնողը: Հետևյալ օրինակում «վերնագիր», «հեղինակ», «տարի» և «գին» տարրերը բոլորը նույն մակարդակի տարրեր են.
Նախնիներ
Հանգույցի ծնող, հանգույցի ծնող և այլն: Հետևյալ օրինակում վերնագրի տարրի նախահայրերը գրքի և գրախանութի տարրերն են.
Հետնորդներ
Հանգույցի երեխաներ, հանգույցի երեխաներ և այլն: Հետևյալ օրինակում «գրախանութ» տարրի երեխաներն են «գիրք», «վերնագիր», «հեղինակ», «տարի» և «գին» տարրերը.
4 Շարահյուսություն XPath
XPath-ն օգտագործում է ուղու արտահայտություններ՝ XML փաստաթղթում հանգույցներ կամ հանգույցների հավաքածուներ ընտրելու համար: Հանգույցը կարելի է ընտրել՝ հետևելով ճանապարհին կամ քայլերին: Ստորև բերված օրինակներում մենք կօգտագործենք հետևյալ XML փաստաթուղթը:
Հանգույցի ընտրություն
Օգտագործելով 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 փաստաթուղթը ավելի ուշ օրինակում:
Առանցքները սահմանում են հանգույցների հավաքածուներ՝ ընթացիկ հանգույցի համեմատ:
Առանցքի անվանումը | Արդյունք |
---|---|
նախահայր | Ընտրում է ընթացիկ հանգույցի բոլոր նախնիները (ծնողներ, տատիկներ, պապիկներ և այլն): |
նախնի-կամ-ես | Ընտրում է ընթացիկ հանգույցի բոլոր նախնիները (ծնողներ, տատիկներ, պապիկներ և այլն) և հենց ներկայիս հանգույցը |
հատկանիշ | |
երեխա | |
ժառանգ | Ընտրում է ընթացիկ հանգույցի բոլոր երեխաներին (երեխաներ, թոռներ և այլն): |
ժառանգ-կամ-ես | Ընտրում է ընթացիկ հանգույցի բոլոր երեխաներին (երեխաներին, թոռներին և այլն) և հենց ընթացիկ հանգույցին |
հետեւելով | Ընտրում է ամեն ինչ փաստաթղթում ընթացիկ հանգույցի թեգը փակելուց հետո |
հետևորդ-եղբայր | Ընտրում է նույն մակարդակի բոլոր հանգույցները ընթացիկ հանգույցից հետո |
անվանատարածք | Ընտրում է բոլոր հանգույցները ընթացիկ հանգույցի տվյալ անվանատարածքում |
ծնող | Ընտրում է ընթացիկ հանգույցի մայրը |
նախորդող | Ընտրում է բոլոր հանգույցները, որոնք հայտնվում են փաստաթղթում ընթացիկ հանգույցից առաջ՝ բացառությամբ նախնիների, հատկանիշի հանգույցների և անվանատարածքի հանգույցների |
նախորդող-եղբայր | Ընտրում է բոլոր եղբայրներին և քույրերին մինչև ընթացիկ հանգույցը |
ինքն իրեն | Ընտրում է ընթացիկ հանգույցը |
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».
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
Համեմատության գործողություններ
- < - логическое «меньше»
- > - տրամաբանական «ավելի քան»
- <= - логическое «меньше либо равно»
- >= - տրամաբանական «մեծ կամ հավասար»
Ինքնուրույն
Փորձեք ստանալ.- նույնիսկ 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 փաստաթուղթը ստորև բերված օրինակներում:
Ընտրեք հանգույց
XPath-ն օգտագործում է ուղու արտահայտություններ՝ XML փաստաթղթում հանգույցներ ընտրելու համար: Կամ ուղու երկայնքով հանգույցի միջով քայլ ընտրելու համար: Ամենաօգտակար ուղու արտահայտությունները թվարկված են ստորև.
Ստորև բերված աղյուսակում մենք ցույց ենք տալիս արտահայտության որոշ ուղիներ և արտահայտության արդյունքը.
Արտահայտություն Ուղին | արդյունք |
---|---|
գրքի խանութ | Ընտրեք գրքի տարրի բոլոր մանկական հանգույցները: |
/ Գրքի խանութ | Ընտրեք արմատային տարրի գրախանութը: Նշում. Եթե ուղին սկսվում է կտրվածքով (/), ուղին միշտ ներկայացնում է տարրի բացարձակ ուղին: |
գրախանութ/գիրք | Ընտրեք գրախանութին պատկանող ենթակետերը բոլոր գրքույկները: |
// Գիրք | Ընտրեք գրքի բոլոր ենթատարրերը՝ անկախ փաստաթղթում նրանց դիրքից: |
գրախանութ // գիրք | Ընտրում է գրքի բոլոր տարրերը, որոնք չեն հանդիսանում տարրի գրախանութի ժառանգները՝ անկախ գրախանութում և գրախանութում իրենց դիրքից: |
// @Lang | Ընտրեք Lang անունով բոլոր հատկությունները: |
Պրեդիկատ(ներ)
Պրեդիկատը օգտագործվում է որոշակի հանգույց կամ հանգույց գտնելու համար, որը պարունակում է նշված արժեքը:
Նախադրյալը փակցված է քառակուսի փակագծերում։
Ստորև բերված աղյուսակում մենք թվարկել ենք մի քանի ուղու արտահայտություններ պրեդիկատներով և արտահայտության արդյունքը.
Արտահայտություն Ուղին | արդյունք |
---|---|
/ Գրախանութ / գիրք | Ընտրեք ենթատարրերը, որոնք պատկանում են աշխատանքային գրքի առաջին տարրին: |
/Գրախանութ/գիրք [վերջին()] | Ընտրեք ենթատարրերը, որոնք պատկանում են գրքի վերջին գրքի տարրին: |
/ Գրախանութ / գիրք [վերջին () - 1] | Ընտրեք երկրորդ գրքի փոխադարձ գրախանութին վերաբերող ենթակետերը։ |
/Գրախանութ/գիրք [դիրք()<3] | Ընտրեք ենթատարրերին պատկանող գրքի տարրի առաջին երկու գրքային տարրերը: |
// Վերնագիր [@lang] | Ընտրեք բոլոր հատկանիշը, որը կոչվում է Lang, ունի տարրի վերնագիր: |
// Վերնագիր [@ LANG = «eng»] | Ընտրեք բոլոր տարրերի անունները, և այդ տարրերն ունեն անգլերեն հատկանիշի արժեքը: |
/գրախանութ/գիրք | Ընտրեք գրքի տարրի բոլոր գրքային տարրերը և գնային տարրի արժեքը, որը պետք է լինի 35,00-ից մեծ: |
/գրախանութ/գիրք/վերնագիր | Ընտրեք գրքի տարրի վերնագրի բոլոր տարրերը, որոնցում գնային տարրի արժեքը պետք է լինի 35,00-ից մեծ: |
Ընտրեք անհայտ հանգույցներ
XPath wildcards-ը կարող է օգտագործվել անհայտ XML տարրեր ընտրելու համար:
Ստորև բերված աղյուսակում մենք թվարկել ենք որոշ ճանապարհային արտահայտություններ, ինչպես նաև այս արտահայտությունների արդյունքները.
Ընտրեք բազմաթիվ ուղիներ
Օգտագործելով «|» ուղու արտահայտությունը օպերատոր, դուք կարող եք ընտրել մի քանի ուղիներ:
Ստորև բերված աղյուսակում մենք թվարկել ենք որոշ ճանապարհային արտահայտություններ, ինչպես նաև այս արտահայտությունների արդյունքները: