შემცირდა 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 დოკუმენტს:

ჰარი პოტერი ჯ.კ როულინგი 2005 29.99

ზემოთ მოყვანილი XML დოკუმენტის კვანძების მაგალითი:

(ძირეული ელემენტი) ჯ.კ როულინგი (კვანძი) lang = "en"(ატრიბუტი)

ატომური მნიშვნელობები

ატომური მნიშვნელობები არის კვანძები, რომლებსაც არ ჰყავთ შვილები ან მშობლები. ატომური მნიშვნელობების მაგალითი:

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"] ირჩევს ყველა "სათაურის" ელემენტს, რომელსაც აქვს "ენის" ატრიბუტი "en" მნიშვნელობით.
/წიგნის მაღაზია/წიგნი ირჩევს ყველა "წიგნის" ელემენტს "წიგნების მაღაზიის" ელემენტის შემდეგ, რომლებსაც აქვთ "ფასის" ელემენტი 35.00-ზე მეტი ღირებულებით.
/წიგნების მაღაზია/წიგნი/სათაური ირჩევს "წიგნების მაღაზიის" ელემენტის ყველა წიგნის "სათაურს" ელემენტს, რომელსაც აქვს "ფასის" ელემენტი 35.00-ზე მეტი ღირებულებით.

უცნობი კვანძების შერჩევა

XPath სპეციალური სიმბოლოები შეიძლება გამოყენებულ იქნას უცნობი XML კვანძების შესარჩევად.

ქვემოთ მოცემულ ცხრილში ჩვენ ჩამოვთვალეთ გამოხატვის რამდენიმე გზა და გამოხატვის შედეგი:

რამდენიმე ბილიკის არჩევა

ოპერატორის გამოყენება | XPath გამონათქვამებში შეგიძლიათ აირჩიოთ მრავალი ბილიკი. ქვემოთ მოცემულ ცხრილში მოცემულია რამდენიმე ბილიკის გამონათქვამი და მათი შედეგები:

5 ღერძები XPath

ჩვენ გამოვიყენებთ შემდეგ XML დოკუმენტს მოგვიანებით მაგალითში.

ჰარი პოტერი 29.99 XML-ის სწავლა 39.95

ღერძი განსაზღვრავს კვანძების კომპლექტს მიმდინარე კვანძთან შედარებით.

ღერძის სახელწოდება შედეგი
წინაპარი ირჩევს მიმდინარე კვანძის ყველა წინაპარს (მშობლებს, ბებია-ბაბუას და სხვ.).
წინაპარი-ან-თავი ირჩევს მიმდინარე კვანძის ყველა წინაპარს (მშობლებს, ბებია-ბაბუას და ა.შ.) და თავად მიმდინარე კვანძს.
ატრიბუტი
ბავშვი
შთამომავალი ირჩევს მიმდინარე კვანძის ყველა შვილს (შვილებს, შვილიშვილებს და ა.შ.).
შთამომავალი-ან-თვითონ ირჩევს მიმდინარე კვანძის ყველა შვილს (შვილებს, შვილიშვილებს და ა.შ.) და თავად მიმდინარე კვანძს.
შემდეგ ირჩევს ყველაფერს დოკუმენტში მიმდინარე კვანძის ტეგის დახურვის შემდეგ
შემდეგი-ძმა ირჩევს იმავე დონის ყველა კვანძს მიმდინარე კვანძის შემდეგ
სახელთა სივრცე ირჩევს ყველა კვანძს მიმდინარე კვანძის მოცემულ სახელთა სივრცეში
მშობელი ირჩევს მიმდინარე კვანძის მშობელს
წინამორბედი ირჩევს ყველა კვანძს, რომელიც გამოჩნდება დოკუმენტში მიმდინარე კვანძის წინ, წინაპრების, ატრიბუტების კვანძების და სახელების სივრცის კვანძების გარდა
წინამორბედი-ძმა ირჩევს ყველა და-ძმას მიმდინარე კვანძამდე
თვით ირჩევს მიმდინარე კვანძს

6 გამონათქვამებიშერჩევის ბილიკები

მდებარეობის გზა შეიძლება იყოს აბსოლუტური ან ფარდობითი. აბსოლუტური მდებარეობის ბილიკი იწყება ხაზით (/), მაგრამ ფარდობითი გზა არა. ორივე შემთხვევაში, შერჩევის ბილიკი შედგება ერთი ან მეტი საფეხურისაგან, რომლებიც გამოყოფილია შტრიხებით:

მდებარეობის აბსოლუტური გზა:

/ნაბიჯი/ნაბიჯი/...

მდებარეობის შედარებითი მოპოვების გზა:

ნაბიჯი/ნაბიჯი/...

თითოეული ნაბიჯი ფასდება მიმდინარე კვანძების ნაკრების კვანძებთან მიმართებაში. ნაბიჯი შედგება:

  • ღერძი (განსაზღვრავს ხის ურთიერთობას შერჩეულ კვანძებსა და მიმდინარე კვანძს შორის);
  • კვანძის შემოწმება (იდენტიფიცირებს კვანძს ღერძის შიგნით);
  • ნული ან მეტი პრედიკატი (კვანძების არჩეული ნაკრების შემდგომი დახვეწისთვის)

ამოღების ნაბიჯის სინტაქსია:

Axisname::nodetestAxisname::nodetest[პროგნოზირებადი]

მაგალითი შედეგი
ბავშვი::წიგნი ირჩევს წიგნის ყველა კვანძს, რომელიც არის მიმდინარე კვანძის შვილი
ატრიბუტი:: ენა ირჩევს მიმდინარე კვანძის ენის ატრიბუტს (lang).
ბავშვი ::* ირჩევს მიმდინარე კვანძის ყველა შვილს
ატრიბუტი::* ირჩევს მიმდინარე კვანძის ყველა ატრიბუტს
ბავშვი::ტექსტი() ირჩევს მიმდინარე კვანძის ყველა ტექსტურ კვანძს
ბავშვი:: node () ირჩევს მიმდინარე კვანძის ყველა უშუალო შვილს
შთამომავალი::წიგნი ირჩევს მიმდინარე კვანძის ყველა შვილს
წინაპარი::წიგნი ირჩევს მიმდინარე კვანძის „წიგნების“ ყველა წინაპარს
წინაპარი-ან-თავი::წიგნი ირჩევს მიმდინარე კვანძის ყველა წიგნის წინაპარს - და მიმდინარე კვანძს, თუ ის ასევე წიგნია
ბავშვი::*/ბავშვი::ფასი ირჩევს "ფასის" ყველა შვილს ერთი დონის დაშორებით მიმდინარე კვანძიდან

7 ოპერატორები XPath

XPath გამონათქვამები ბრუნდება როგორც კვანძების, სტრიქონების, ლოგიკური ან რიცხვითი მნიშვნელობების ნაკრები. ქვემოთ მოცემულია XPath გამონათქვამებში გამოყენებული ოპერატორების სია:

ოპერატორი აღწერა მაგალითი
| ითვლის კვანძების ორ კომპლექტს //წიგნი | //cd
+ დამატება 6 + 4
- გამოკლება 6 - 4
* გამრავლება 6 * 4
დივ განყოფილება 8 div 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=new 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 იყენებენ vlerësim() მეთოდს 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;
- ცეცხლის ბილიკი;
(შეგიძლიათ გამოიყენოთ ნებისმიერი სხვა ბრაუზერი ვიზუალური xpath მხარდაჭერით)
- ცოტა დრო.

როგორც ვებ გვერდი ექსპერიმენტის ჩასატარებლად, მე გთავაზობთ მსოფლიო ქსელის კონსორციუმის ვებსაიტის მთავარ გვერდს ("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"]– პრედიკატი, რომლის საფუძველზეც ვეძებთ კვანძს, რომელსაც აქვს id ატრიბუტი, რომელიც ტოლია “w3c_home_upcoming_events”. 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 – ვიღებთ ყველა ბმულს ტექსტით „არქივი“.

პოზიცია() და მოდიფიკაცია:
position() - აბრუნებს ელემენტის პოზიციას კომპლექტში.
mod არის განყოფილების დარჩენილი ნაწილი.

ამ ფუნქციების კომბინაციით ჩვენ შეგვიძლია მივიღოთ:
- ელემენტები ul/li კი არა
- ლუწი ელემენტები: ul/li

შედარების ოპერაციები

  • < - логическое «меньше»
  • > - ლოგიკური "უმეტეს"
  • <= - логическое «меньше либо равно»
  • >= - ლოგიკური "მეტი ან ტოლი"
ul/li , ul/li - ჩამოთვალეთ ელემენტები მე-3 ნომრიდან და პირიქით.

Ერთი საკუთარი

შეეცადეთ მიიღოთ:
- თუნდაც URL ბმულები მარცხენა მენიუდან "სტანდარტები";
- ყველა სიახლეების სათაური, გარდა პირველის w3c.org-ის მთავარი გვერდიდან.

Xpath PHP5-ში

$dom = new DomDocument(); $dom->loadHTML($HTMLCode); $xpath = ახალი DomXPath($dom); $_res = $xpath->query(".//*[@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-ს, vlerësა() უბრალოდ დააბრუნებს რიცხვს, შეგიძლიათ ეს პირდაპირ გამოიყენოთ კვანძიდან მონაცემების მისაღებად. .

XPath კოდი და სიჩქარის უპირატესობები

მოდით შევხედოთ მარტივ მაგალითს, რომელიც დააბრუნებს კონკრეტული ავტორის მიერ დაწერილი წიგნების რაოდენობას. ჩვენ განვიხილავთ პირველ მეთოდს ისე, როგორც ყოველთვის, XPath-ის გამოყენების გარეშე. ახლა თქვენ გაიგებთ, როგორ გააკეთოთ ეს XPath-ის გარეშე და რამდენად ადვილია ამის გაკეთება XPath-ით.

domDocument->getElementsByTagName("ავტორი"); foreach ($elements როგორც $element) ( if ($element->nodeValue == $author) ( $total++; ) ) დააბრუნეთ $number; )

შემდეგი მეთოდი აბრუნებს იგივე შედეგს, მაგრამ იყენებს XPath-ს იმ წიგნების შესარჩევად, რომლებიც დაწერილია კონკრეტული ავტორის მიერ.

domDocument); $result = $xpath->query ($query); დაბრუნება $result->length; )

გაითვალისწინეთ, რომ ჩვენ არ გვჭირდება ხელახლა გადავამოწმოთ თითოეული ელემენტის მნიშვნელობა, რათა დავადგინოთ, რომელმა ავტორმა დაწერა თითოეული წიგნი. მაგრამ ჩვენ შეგვიძლია უფრო გავამარტივოთ კოდი XPath ფუნქციის გამოყენებით დათვლა ()ელემენტების შიგთავსის დათვლა ამ გზაზე.

domDocument); return $xpath->evaluate($query); )

ჩვენ შეგვიძლია მივიღოთ საჭირო ინფორმაცია ერთი ხაზის XPath მოთხოვნით. არ არის საჭირო ბევრი PHP ფილტრის შექმნა. ეს არის ამ ფუნქციის ჩაწერის ყველაზე მარტივი და სწრაფი გზა!

გაითვალისწინეთ, რომ value() გამოყენებული იყო ბოლო მაგალითში. ეს იმიტომ ხდება, რომ count() ფუნქცია აბრუნებს ტექსტურ შედეგს. query()-ის გამოყენება დააბრუნებს DOMNodeList-ს, მაგრამ ის ცარიელი იქნება.

XPath-ის გამოყენება ღირს, რადგან ის არა მხოლოდ აადვილებს თქვენს PHP კოდს, ის ასევე გთავაზობთ სიჩქარის სარგებელს. შევამჩნიე, რომ პირველი ვერსია საშუალოდ 30%-ით უფრო სწრაფი იყო მეორესთან შედარებით. მაგრამ მესამე არის 10% უფრო სწრაფი ვიდრე პირველი. რა თქმა უნდა, ეს დამოკიდებულია თქვენს სერვერზე და შეკითხვებზე, რომლებსაც იყენებთ. XPath-ის სუფთა სახით გამოყენება იძლევა უდიდეს შედეგებს კოდის დაწერის სიჩქარესა და სიმარტივეში.

XPath ფუნქციები

აქ არის რამოდენიმე ფუნქცია, რომელიც შეიძლება გამოყენებულ იქნას XPath-თან. თქვენ ასევე იპოვით უამრავ რესურსს, რომელიც დეტალურად აღწერს თითოეული ხელმისაწვდომი მახასიათებლის შესახებ. თუ გჭირდებათ DOMNodeList-ის გამოთვლა ან nodeValue (კვანძის მნიშვნელობა) შედარება, შეგიძლიათ იპოვოთ შესაფერისი XPath ფუნქცია, რომელიც გამორიცხავს არასაჭირო PHP კოდის გამოყენებას.

თქვენ ეს უკვე იცით count() ფუნქციის მაგალითიდან. გამოვიყენოთ id() ფუნქცია მოცემული ISBN-ებით წიგნების სათაურების მისაღებად. ამისათვის თქვენ უნდა გამოიყენოთ შემდეგი XPath გამოხატულება:

id ("isbn1234 isbn1235")/სათაური

გაითვალისწინეთ, რომ მნიშვნელობები, რომლებსაც ეძებთ, არ უნდა იყოს ჩასმული ფრჩხილებში, უბრალოდ გამოყოფილი სივრცეებით. ასევე, არც იფიქროთ მძიმის დამატებაზე:

domDocument); $result = $xpath->query ($query); $წიგნები = მასივი(); foreach ($result როგორც $node) ( $book = array ("title" => $booknode->nodeValue); $books = $book; ) დააბრუნეთ $books; )

რთული ფუნქციების მართვა XPath-ში წარმოუდგენლად მარტივია.

PHP ფუნქციების გამოყენება XPath-თან ერთად

ზოგჯერ დაგჭირდებათ მეტი ფუნქციონირება, რასაც სტანდარტული XPath ფუნქციები ვერ უზრუნველყოფს. საბედნიეროდ, PHP DOM საშუალებას აძლევს მშობლიურ PHP ფუნქციებს ურთიერთქმედონ XPath შეკითხვებთან.

მოდით შევხედოთ მაგალითს, რომელიც აბრუნებს წიგნის სათაურის სიტყვების რაოდენობას. ამ უმარტივეს ფუნქციაში ჩვენ დავწერთ შემდეგს:

domDocument); $result = $xpath->query ($query); $title = $result->item(0)->getElementsByTagName("title") ->item(0)->nodeValue; დაბრუნება str_word_count($title); )

მაგრამ, ჩვენ ასევე შეგვიძლია ჩავრთოთ str_word_count() ფუნქცია პირდაპირ XPath მოთხოვნაში. ეს შეიძლება გაკეთდეს რამდენიმე ნაბიჯით. უპირველეს ყოვლისა, ჩვენ უნდა დავარეგისტრიროთ სახელთა სივრცე XPath ობიექტით. PHP ფუნქციები XPath მოთხოვნებში გამოიძახება სტრიქონის გამოყენებით "php:functionString", რის შემდეგაც იწერება სასურველი ფუნქციის სახელი. ასევე, სახელთა სივრცე უფრო დეტალურად არის განხილული http://php.net/xpath. სახელთა სივრცის სხვა მნიშვნელობები შეცდომას გამოიწვევს. ამის შემდეგ ჩვენ უნდა გამოვიძახოთ registerPHPFunctions(). ეს ფუნქცია ეუბნება PHP-ს, რომ როდესაც ზარი განხორციელდება სახელთა სივრცის მეშვეობით "php:", PHP ამუშავებს ამ ზარს.

ფუნქციების გამოძახების მაგალითი სინტაქსი იქნება:

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

მოდით ეს ყველაფერი გავაერთიანოთ შემდეგი getNumberOfWords() ფუნქციის მაგალითში:

domDocument); //რეგისტრაცია php სახელთა სივრცე $xpath->registerNamespace("php", "http://php.net/xpath"); //ახლა php ფუნქციების გამოძახება შესაძლებელია xpath მოთხოვნებში $xpath->registerPHPFunctions(); $query = "php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/სათაური))"; return $xpath->evaluate($query); )

გაითვალისწინეთ, რომ თქვენ არ გჭირდებათ XPath ფუნქციის ტექსტის () გამოძახება კვანძის ტექსტის მისაღებად. registerPHPFunctions() მეთოდი ამას ავტომატიზირებს. თუმცა, კოდის შემდეგი მაგალითის ხაზი ასევე სწორი იქნება:

php:functionString("str_word_count",(//library/book[@isbn = "$isbn"]/სათაური))

PHP ფუნქციების რეგისტრაცია არ შემოიფარგლება მხოლოდ იმ ფუნქციებით, რომლებიც შედის PHP-ში. თქვენ შეგიძლიათ განსაზღვროთ თქვენი საკუთარი ფუნქციები და გამოიყენოთ ისინი XPath-ში. ერთადერთი განსხვავება ისაა, რომ თქვენ მოგიწევთ გამოიყენოთ "php:function" ნაცვლად "php:functionString".

მოდით დავწეროთ ფუნქცია კლასის გარეთ ძირითადი ფუნქციონირების დემონსტრირებისთვის. ფუნქცია, რომელსაც ჩვენ გამოვიყენებთ, აბრუნებს ავტორის „ჯორჯ ორუელის“ წიგნებს. ის უნდა დაბრუნდეს true თითოეული კვანძისთვის, რომელიც გსურთ შეიყვანოთ მოთხოვნაში.

nodeValue == "(! LANG: ჯორჯ ორუელი"; } !}

არგუმენტი, რომელიც გადაეცემა ფუნქციას, არის DOM ელემენტების მასივი. ეს ფუნქცია გადის მასივში და განსაზღვრავს აუცილებელ ელემენტებს და შემდეგ აერთიანებს მათ DOMNodeList-ში. ამ მაგალითში შესამოწმებელი კვანძი იყო /book და ჩვენ ასევე გამოვიყენეთ /author საჭირო ელემენტების დასადგენად.

ახლა ჩვენ შეგვიძლია შევქმნათ getGeorgeOrwellBooks() ფუნქცია:

domDocument); $xpath->registerNamespace("php", "http://php.net/xpath"); $xpath->registerPHPFunctions(); $query = "//ბიბლიოთეკა/წიგნი1"; $result = $xpath->query ($query); $წიგნები = მასივი(); foreach($result როგორც $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 დოკუმენტში კვანძების შესარჩევად. ან კვანძის გავლით გზაზე, რომ აირჩიოთ ნაბიჯი. შემდეგი არის ყველაზე სასარგებლო ბილიკის გამონათქვამები:

ქვემოთ მოცემულ ცხრილში ჩვენ ვაჩვენებთ გამოხატვის რამდენიმე გზას და გამოხატვის შედეგს:

გამოხატვის გზაშედეგი
წიგნის მაღაზიააირჩიეთ წიგნის ელემენტის ყველა ბავშვის კვანძი.
/ წიგნის მაღაზია

აირჩიეთ root ელემენტის წიგნის მაღაზია.

შენიშვნა: თუ ბილიკი იწყება ხაზით (/), ბილიკი ყოველთვის წარმოადგენს ელემენტის აბსოლუტურ გზას!

წიგნის მაღაზია/წიგნიაირჩიეთ ქვეპუნქტები, რომლებიც ეკუთვნის წიგნის მაღაზიის ყველა წიგნს.
// Წიგნიაირჩიეთ წიგნის ყველა ქვეელემენტი, მიუხედავად მათი პოზიციისა დოკუმენტში.
წიგნის მაღაზია // წიგნიირჩევს წიგნის ყველა ელემენტს, რომელიც არ არის ელემენტის წიგნის მაღაზიის შთამომავლები, მიუხედავად მათი პოზიციისა წიგნის მაღაზიაში და მის ქვეშ.
// @Langაირჩიეთ ყველა თვისება სახელად Lang.

პრედიკატი(ები)

პრედიკატი გამოიყენება კონკრეტული კვანძის ან კვანძის მოსაძებნად, რომელიც შეიცავს მითითებულ მნიშვნელობას.

პრედიკატი ჩასმულია კვადრატულ ფრჩხილებში.

ქვემოთ მოცემულ ცხრილში ჩვენ ჩამოვთვალეთ რამდენიმე ბილიკის გამონათქვამი პრედიკატებით და გამოხატვის შედეგი:

გამოხატვის გზაშედეგი
/ წიგნის მაღაზია / წიგნიაირჩიეთ ქვეელემენტები, რომლებიც ეკუთვნის პირველ სამუშაო წიგნის ელემენტს.
/წიგნების მაღაზია/წიგნი [ბოლო()]აირჩიეთ ქვეელემენტები, რომლებიც ეკუთვნის წიგნის ბოლო წიგნის ელემენტს.
/ წიგნის მაღაზია / წიგნი [ბოლო () - 1]შეარჩიეთ ქვეპუნქტები, რომლებიც დაკავშირებულია მეორე წიგნის წიგნთან ურთიერთობის მაღაზიასთან.
/წიგნების მაღაზია/წიგნი [პოზიცია()<3] აირჩიეთ წიგნის პირველი ორი ელემენტი, რომელიც ეკუთვნის ქვეელემენტებს.
// სათაური [@lang]აირჩიეთ ყველა ატრიბუტი სახელად Lang აქვს ელემენტის სათაური.
// სათაური [@ LANG = "eng"]აირჩიეთ ყველა ელემენტის სახელი და ამ ელემენტებს აქვთ ინგლისური ატრიბუტის მნიშვნელობა.
/წიგნის მაღაზია/წიგნიაირჩიეთ წიგნის ელემენტის ყველა წიგნის ელემენტი და ფასის ელემენტის მნიშვნელობა, რომელიც უნდა იყოს 35,00-ზე მეტი.
/წიგნების მაღაზია/წიგნი/სათაურიაირჩიეთ წიგნის ელემენტის სათაურის ყველა ელემენტი წიგნის ელემენტში და რომლებშიც ფასის ელემენტის მნიშვნელობა უნდა იყოს 35,00-ზე მეტი.

აირჩიეთ უცნობი კვანძები

XPath wildcards შეიძლება გამოყენებულ იქნას უცნობი XML ელემენტების შესარჩევად.

ქვემოთ მოცემულ ცხრილში ჩვენ ჩამოვთვალეთ რამდენიმე ბილიკის გამონათქვამი, ისევე როგორც ამ გამონათქვამების შედეგები:

აირჩიეთ მრავალი გზა

ბილიკის გამოხატვის გამოყენებით "|" ოპერატორი, შეგიძლიათ აირჩიოთ რამდენიმე გზა.

ქვემოთ მოცემულ ცხრილში ჩვენ ჩამოვთვალეთ რამდენიმე ბილიკის გამონათქვამი, ისევე როგორც ამ გამონათქვამების შედეგები.