[XML/PHP] xsd geeft problemen voor xpath query's

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb hieronder een stukje pseudo code gezet van een probleem waar ik maar niet uitkomen. Dit deel van de code bevind zich binnen een epp server en de xml string krijgt hij binnen via een socket. Dat werkt allemaal prima, alleen ik kan geen xpath query's op het xml document uitvoeren. En dat is best jammer :)

Als ik binnen het epp element alles wat betreft namespaces en xml schema weg haal werkt het wel. Je zou dus denken: dan ligt het aan je schema's. Raar maar waar, de functie schemaValidate() geeft aan dat alles in orde is?

Wat doe ik niet goed?

PHP:
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
<?php

error_reporting(E_ALL);

$dom = new DOMDocument();

$dom -> loadXML('<?xml version="1.0" encoding="UTF-8"?><epp xmlns="http://www.eurid.eu/xml/epp/epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eurid.eu/xml/epp/epp-1.0 epp-1.0.xsd"><hello>aa</hello></epp>');

if ($dom -> schemaValidate('http://www.reprovinci.nl/epp/epp-1.0.xsd'))
{
    echo 'parsen is gelukt<br /><br />';
}
else 
{
    echo 'parsen is mislukt<br /><br />';
}

$xpath = new DOMXPath($dom);

$nodes = $xpath -> query('//hello');

foreach ($nodes as $node)
{
    echo 'node gevonden...<br />';
}

?>

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Ik gok dat je in je XPath-query moet aangeven dat je {http://www.eurid.eu/xml/epp/epp-1.0}hello zoekt (om maar even Clark's notatie te gebruiken). Je geeft nu in je XPath-query geen namespace, maar je zoekt wel een element dat de namespace van <epp> heeft geërfd.

Rustacean


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou je gok is goed geweest. Alleen de oplossing heeft me nog wel wat uurtjes gekost. Maar nu ik de oplossing heb is het logisch en simpel en snap ik niet dat ik daar zo lang over heen keek :)

Ik heb regel 19 in onderstaande code toegevoegd en registreer daarmee de te gebruiken namespace binnen het XPath object. Ik maak daar een prefix voor aan (in dit geval heb ik gekozen voor "pf"). Deze prefix dien je dan te gebruiken binnen je xpath query.

Hartstikke bedankt voor het geven van de tip!

PHP:
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
<?php

error_reporting(E_ALL);

$dom = new DOMDocument(); 

$dom -> loadXML('<?xml version="1.0" encoding="UTF-8"?><epp xmlns="http://www.eurid.eu/xml/epp/epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eurid.eu/xml/epp/epp-1.0 epp-1.0.xsd"><hello>aa</hello></epp>'); 

if ($dom -> schemaValidate('http://www.reprovinci.nl/epp/epp-1.0.xsd')) 
{ 
    echo 'parsen is gelukt<br /><br />'; 
} 
else  
{ 
    echo 'parsen is mislukt<br /><br />'; 
} 

$xpath = new DOMXPath($dom); 
$xpath -> registerNamespace('pf', 'http://www.eurid.eu/xml/epp/epp-1.0');

$nodes = $xpath -> query('//pf:hello'); 

foreach ($nodes as $node) 
{ 
    echo 'node gevonden...<br />'; 
} 

?>