[PHP / XPATH] query met verschillende geneste conditities

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor een project aan het werk met PHP en Xpath. Xpath redelijk nieuw voor me, maar krijg inmiddels al redelijk leuke dingen te voorschijn. Er is echter 1 ding waar ik niet goed uitkom. Hoop dat hier iemand mij aan de juiste xpath query kan helpen...

Ik heb de volgende (voorbeeld) XML

XML:
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
<a>
   <b>
      <b1>waardeb1</b1>
      <b2>waardeb2</b2>
      <b3>
         <c1>waardec1</c1>
         <c2>waardec2</c2>
         <c3>
            <d1>waarde</d1>
         </c3>
      </b3>
   </b>
   <b>
      <b1>waardeb3</b1>
      <b2>waardeb4</b2>
      <b3>
         <c1>waardec3</c1>
         <c2>waardec4</c2>
         <c3>
            <d1>waarde</d1>
         </c3>
      </b3>
   </b>
   <b>
      <b1>waardeb5</b1>
      <b2>waardeb6</b2>
      <b3>
         <c1>waardec5</c1>
         <c2>waardec6</c2>
         <c3>
            <d1>waarde</d1>
         </c3>
      </b3>
   </b>
   <b>
      <b1>waardeb7</b1>
      <b2>waardeb8</b2>
      <b3>
         <c1>waardec7</c1>
         <c2>waardec8</c2>
         <c3>
            <d1>waarde</d1>
         </c3>
      </b3>
   </b>
</a>


Wat ik nu terug wil krijgen is het volgende:

alles onder b (inclusief b) waar b1 = waardeb1 en b2 = waardeb2 én waar c1 = waardec1

Diverse xpath queries lukken prima. Ik krijg bijvoorbeeld met de volgende query alles dat voldoet aan condities b1, b2 en c1, maar hierin ontbreekt node b (krijg node b3 en alles daaronder terug, wat logisch is)
XML:
1
b[b1="waardeb1" and b2="waardeb2"]/b3[c1="waardec1"]


Andere queries (zoals hieronder) geven wel b en alles daaronder terug welke voldoen aan b1 en b2, maar niet aan c1 (krijg dus alle c's terug)

XML:
1
b[b1="waardeb1" and b2="waardeb2" and b3[c1="waardec1"]]


Met verschillende van de hierboven genoemde varianten zitten rommelen, maar het heeft nog niet het gewenste resultaat opgeleverd.
Is het uberhaupt te doen wat ik wil in 1 query en zo ja, hoe vertaalt dit zich naar een goede Xpath query?

[ Voor 6% gewijzigd door Verwijderd op 07-02-2010 20:21 ]


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Wellicht dat je wat aan XPath parent hebt.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thanks voor de suggestie.

als ik parent toevoeg aan het einde van de query als volgt:

XML:
1
b[b1="waardeb1" and b2="waardeb2"]/b3[c1="waardec1"]/..


Krijg ik alsnog alle bovenliggende b's terug (dat gaat dus goed), maar is c opnieuw niet gefilterd...

Acties:
  • 0 Henk 'm!

  • cfern
  • Registratie: Oktober 2009
  • Laatst online: 13-09 15:35
Ik heb even met SketchPath zitten kloten en kwam op de volgende XPath uit:

code:
1
//b[b1='waardeb1' and b2='waardeb2' and b3[c1='waardec1']]


Deze geeft dus alle b nodes waar dan ook terug die aan de gestelde eisen voldoen (als ik het goed begrepen heb).

edit:
dat kon korter

[ Voor 8% gewijzigd door cfern op 07-02-2010 14:41 ]

"I'd rather have a full bottle in front of me, than a full frontal lobotomy." (Tom Waits) | PoE


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Deze geeft dus alle b nodes waar dan ook terug die aan de gestelde eisen voldoen (als ik het goed begrepen heb).
Dat is wel wat ik bedoel, maar het lijkt nog niet helemaal goede resultaten te leveren op het moment dat ik andere condities opgeef (bijvoorbeeld zoek naar waardeb3 en waardeb4 en waardec3

Acties:
  • 0 Henk 'm!

  • cfern
  • Registratie: Oktober 2009
  • Laatst online: 13-09 15:35
In jouw voorbeeld staan <b1>waardeb3</b1> en <b2>waardeb4</b2> niet binnen een <b>-element, maar los binnen de <a>, daarom krijg je ze niet terug. De query verwacht b1, enz. alleen binnen een <b>-element.

"I'd rather have a full bottle in front of me, than a full frontal lobotomy." (Tom Waits) | PoE


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@cfern je hebt gelijk, had ik geconstateerd en gefixed in het voorbeeld, maar volgens mij lost dit m'n issue nog niet op (of ik doe nog steeds iets verkeerd uiteraard)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Als ik het goed snap doe je nu
code:
1
a/b[b1="waardeb1" and b2="waardeb2" and b3[c1="waardec1"]]

En krijg je daaruit:
XML:
1
2
3
4
5
6
7
8
9
10
11
<b>
      <b1>waardeb3</b1>
      <b2>waardeb4</b2>
      <b3>
         <c1>waardec3</c1>
         <c2>waardec4</c2>
         <c3>
            <d1>waarde</d1>
         </c3>
      </b3>
   </b>

En je wilt eigenlijk krijgen:
XML:
1
2
3
4
5
6
7
<b>
      <b1>waardeb3</b1>
      <b2>waardeb4</b2>
      <b3>
         <c1>waardec3</c1>
      </b3>
   </b>

Maar dat laatste is niet een originele node, dus dat kun je niet terugkrijgen. Je kan wel die b-node (incl. alles), die b1,b2,b3 en die c1 allemaal als resultaaat-nodes terugkrijgen (nu even zonder rekening te houden met meerdere voorkomens in een b-tag):
code:
1
2
a/b[b1="waardeb1" and b2="waardeb2" and b3[c1="waardec1"]]/
   descendant-or-self::*[self::b or self::b1 or self::b2 or self::b3 or self::c1]

Maar ook dan krijg je steeds de kinderen natuurlijk mee. Misschien is het handiger om binnen de b-tag weer een nieuwe XPath query te doen of om iets als XQuery/XSLT te gebruiken - ik weet niet welk probleem je nu eigenlijk wil oplossen.. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 13-09 17:35
XML:
1
//b[(b1 =  'waardeb3') and (b2 = 'waardeb4') and (descendant::c1 = 'waardec3')]

Volgens mij bedoel je bovenstaande. Hier krijg ik gewoon b mee.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat ik dus eigenlijk wil is op basis van een drietal criteria, die met een GET form in PHP (ik gebruik simplexml) worden doorgegeven de XML filteren. Drie criteria liggen echter op verschillende niveaus namelijk binnen b en binnen c. Op één of andere manier leiden de hier aangereikte suggesties nog niet tot gewenst resultaat. Ik krijg nog steeds alles terug onder C, zelfs met de laatste twee varianten.

Dubbele xpath of in de array zelf filteren is misschien nog wel een optie :-D

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ARGH 8)7 |:(

simplexml_load_file was de big boosdoener. Zelfde file inlezen en xPath querien met DOMDocument() levert wel het gewenste resultaat...

thanks @jip_86 voor de winnende suggestie :P


nope, issue treedt weer op wanneer er meerdere c3's worden toegevoegd. Op dat moment pakt ie alle c3's mee, omdat er 1 c3 is waar op gematched wordt. Waarschijnlijk toch niet helemaal mogelijk wat ik wil

[ Voor 35% gewijzigd door Verwijderd op 08-02-2010 23:00 ]

Pagina: 1