[PHP] XPath om <select> met options uit te lezen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 17-05 14:37
Met PHP ben ik bezig een work around te maken voor een missende feature in een externe portal welke wij gebruiken. Om dit te kunnen doen heb ik alle "<options>" uit de select nodig. Met XPath kom ik hier een heel eind in maar op de een of andere manier krijg ik de values van de options er niet in.

Het lastige is dat als ik Google met Xpath en "select" erin Google niet helemaal begrijpt dat ik de HTML <select> bedoel waardoor mijn resultaten redelijk garbage zijn.

HTML:
1
2
3
4
5
6
<select name="henk">
<option value="45">Tekst A</option>
<option value="62">Tekst B</option>
<option value="144">Tekst C</option>

</select>


Dit is (als voorbeeld) de select die ik wil uitlezen. Ik gebruik in PHP hiervoor de volgende XPath query:

PHP:
1
$xpath->query("//select[@name='henk']/option");


Ik krijg nu netjes alle nodes te zien als ik daar doorheen loop maar zonder de value. Ik krijg alleen de inhoud van de option te zien. Komt dit omdat ik eigenlijk al een stap te ver ben gegaan door de /option al te selecteren? En hoe werk ik hier omheen? Ik heb dus de value nodig (bijv. 45, 62 of 144) en de bijbehorende tekst (bijv Tekst A, Tekst B of Tekst C).

Sample output met bovenstaande code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
DOMElement Object
(
    [tagName] => option
    [schemaTypeInfo] => 
    [nodeName] => option
    [nodeValue] => Tekst A
    [nodeType] => 1
    [parentNode] => (object value omitted)
    [childNodes] => (object value omitted)
    [firstChild] => (object value omitted)
    [lastChild] => (object value omitted)
    [previousSibling] => (object value omitted)
    [nextSibling] => (object value omitted)
    [attributes] => (object value omitted)
    [ownerDocument] => (object value omitted)
    [namespaceURI] => 
    [prefix] => 
    [localName] => option
    [baseURI] => 
    [textContent] => Tekst A
)

DOMElement Object
(
    [tagName] => option
    [schemaTypeInfo] => 
    [nodeName] => option
    [nodeValue] => Tekst B
    [nodeType] => 1
    [parentNode] => (object value omitted)
    [childNodes] => (object value omitted)
    [firstChild] => (object value omitted)
    [lastChild] => (object value omitted)
    [previousSibling] => (object value omitted)
    [nextSibling] => (object value omitted)
    [attributes] => (object value omitted)
    [ownerDocument] => (object value omitted)
    [namespaceURI] => 
    [prefix] => 
    [localName] => option
    [baseURI] => 
    [textContent] => Tekst B
)

DOMElement Object
(
    [tagName] => option
    [schemaTypeInfo] => 
    [nodeName] => option
    [nodeValue] => Tekst C
    [nodeType] => 1
    [parentNode] => (object value omitted)
    [childNodes] => (object value omitted)
    [firstChild] => (object value omitted)
    [lastChild] => (object value omitted)
    [previousSibling] => (object value omitted)
    [nextSibling] => (object value omitted)
    [attributes] => (object value omitted)
    [ownerDocument] => (object value omitted)
    [namespaceURI] => 
    [prefix] => 
    [localName] => option
    [baseURI] => 
    [textContent] => Tekst C
)


Als ik in de Xpath query er echter @value achter zet verdwijnt mn veld naam 8)7

PHP:
1
2
3
[code=php]
$xpath->query("//select[@name='henk']/option/@value");
[/code]

Beste antwoord (via WoBBeL op 20-07-2022 21:10)


  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 20:56
Nee gebruik je eerste xpath query, maar òp een option DomElement gebruik $element->attributes() (of $element->getAttribute('value') denk ik) om de die property erbij te pakken terwijl je erdoorheen loopt met foreach o.i.d.

[ Voor 17% gewijzigd door OnTracK op 20-07-2022 21:08 ]

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.

Alle reacties


Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 20:56
Je moet de attributes van een het option DOMElement bekijken. De value is geen eigen node.

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 17-05 14:37
@OnTracK ik had nog snel een update toegevoegd. Met de XPath query toevoeging /@value krijg ik wel netjes de juiste values (dus de 45, 62 en 144) maar dan mis ik de names (Test A, Test B en Test C).

Ook als ik alleen XPath query doe met /select (dus zonder /option) en vervolgens door de childNodes loop mist de value 8)7

[ Voor 30% gewijzigd door WoBBeL op 20-07-2022 21:00 ]


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 20:56
Nee gebruik je eerste xpath query, maar òp een option DomElement gebruik $element->attributes() (of $element->getAttribute('value') denk ik) om de die property erbij te pakken terwijl je erdoorheen loopt met foreach o.i.d.

[ Voor 17% gewijzigd door OnTracK op 20-07-2022 21:08 ]

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 17-05 14:37
@OnTracK ah ik snap hem. Ik heb nu de XPath query op //select/option gezet en ik pak daarna de attributes van de nodes er bij. Logischer kon ook niet.

Je zou t ook niet zeggen maar ik ben geen programmeur :+