[PHP/XML/XPath] Zoeken via xpath

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sanzut
  • Registratie: December 2006
  • Laatst online: 19:44

sanzut

It's always christmas time

Topicstarter
Hoi,

ik ben mezelf aan het verdiepen in XML en Xpath via PHP. Als test heb ik hiervoor een XML bestand gemaakt dat de gegevens over diverse CD's bij kan houden.

Ik heb tot nu toe alles met loops en if-constructies gemaakt:
PHP:
1
2
3
4
5
<?php
  $xmlCds = $xml->getElementsByTagName("cd");
  $ok = false;
  foreach ($xmlCds as $xmlCd) echo($xmlCd->getAttribute("titel")." - ".$xmlCd->getAttribute("titel"));
?>


Nu kwam ik er via de PHP website achter dat er ook zoiets bestaat als XPath. Dit zou een taal zijn, om het xml bestand wat meer op een database-achtige manier te benaderen.

Nou ben ik hiermee aan het experimeteren om te kunnen zoeken in de CD's uit de xml!
PHP:
1
2
3
4
5
6
7
8
9
10
$xml = new DOMDocument();
$xml->load("xml.xml");

$xpath = new DOMXPath($xml);
$query = "/cds/cd[@*=".$_GET['zoek']."']";
$entries = $xpath->query($query);
foreach ($entries as $entry) {
  $resultaat = $entry->nextSibling->previousSibling;
    echo "Gevonden".$resultaat->getAttribute('artiest')." - ".$resultaat->getAttribute('titel')."<br>";
}


Dit werkt wel, maar alleen als je zoekt op de exacte term. Denk bijvoorbeeld aan de volgende situatie:
Artiest = Jan Smit
Als je dan zoekt op Jan smit of Jan dan vind hij hem niet, terwijl Jan Smit wel werkt, xPath is dus hoofdletter gevoelig, en kan niet zoeken op partial-matches.

Is hier een oplossing voor?

alvast bedankt!

gr Sander

Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Je kan wel degelijk zoeken op partial matches, namelijk met de functie (drumroll) matches(string, regex). Op die pagina staan overigens ook allemaal andere handige functies.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Jawel, alles converteren naar dezelfde case of inderdaad gebruik maken van matches zoals hierboven aangegeven. Maar ik wil je wel even waarschuwen dat XML + XPath niet op magische wijze een RDBMS kan vervangen. Pas op voor die valkuil ;)

[ Voor 9% gewijzigd door RobIII op 09-10-2008 10:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • sanzut
  • Registratie: December 2006
  • Laatst online: 19:44

sanzut

It's always christmas time

Topicstarter
Roblll, uiteraard niet, daar ben ik mezelf natuurlijk wel bewust van. Ik zal het omzetten naar dezelfde case eens proberen.
Gerco, de funcite matches zal ik ook even bestuderen:)

Thnx:)

edit:
Heb het nu geprobeerd met de volgende query
[code=[php]$query = "/cds/cd/[@*=matches('".$_GET['value']."'.*)]";[/code]
Maar dit resulteert in de foutmelding
[code]Warning: DOMXPath::query() [function.DOMXPath-query]: Invalid expression[/code]

Ik doe iets niet goed volgens Xpath, maar wat:p ?

[ Voor 45% gewijzigd door sanzut op 09-10-2008 10:54 ]


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

PHP:
1
$query = "/cds/cd/[@*=matches('".$_GET['value']."'.*)]";

'matches' Is een functie die twee argumenten vereist en je geeft er maar een. Het argument dat je wilt hebben is de waarde van de betreffende attribute node, maar de vraag is of je daar op die plaats toegang toe hebt: je wilt eigenlijk middenin je expressie al iets doen met het resultaat van de expressie. Daarnaast is nog het probleem dat de matches functie een resultaat teruggeeft. Als dat resultaat op de plaats van de functie-aanroep in de omliggende expressie ingevuld wordt, dan blijft er niets iets over dat je wilt. Kortom: die 'matches' staat niet op de plaats waar hij hoort. Als je dit wilt, dan moet je alle kandidaat nodes verzamelen, de matches() er in een for-each op los laten en de matchende nodes tot een node-set samenbreien die het resultaat kan zijn. Van dat laatste heb ik geen idee of het wel mogelijk is.

Misschien werkt trouwens
XML:
1
matches(/cds/cd/@*, '".$_GET['value']."'.*)
maar ik heb even geen goede testdata bij de hand en ik dacht dat matches niet op de nodesets werkte...

[ Voor 9% gewijzigd door Confusion op 09-10-2008 22:25 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Volgens mij is matches() XPath 2.0, terwijl php nu aan versie 1.0 doet. Kijk daarom naar dingen als contains(), substring-after()/-before() en translate(). Denk daarnaast aan htmlspecialchars en gebruik enkele haakjes om de XPath-expressie, en dubbele haakjes in de XPath-expressie.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1