[PHP] DomDocument en xmlns in de rootnode

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb hier gister de haren over uit mn hoofd getrokken, vandaag eindelijk tot de wortel van het probleem gekomen. Het betreft het volgende stuk voorbeeldcode:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

$xml = new DomDocument();
$xml->loadXML('<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test"><node /></root>
');

$xpath = new DOMXPath($xml);
echo $xpath->query('node')->length;

$xml = new DomDocument();
$xml->loadXML('<?xml version="1.0" encoding="UTF-8"?>
<root><node /></root>
');

$xpath = new DOMXPath($xml);
echo $xpath->query('node')->length;


De verwachte output is wat mij betreft '11', maar tot mijn stomme verbazing is de output '01'. Om de een of andere reden wil xpath niet meer lekker querien als er een xmlns-attribuut in de roottag staat. Kan iemand mij vertellen waarom dit is? Mijn workaround is nu maar om het attribuut eruit te regexpen voor ik de string in loadXML gooi, maar dit lijkt me toch niet helemaal de bedoeling.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Wat je sowieso zou kunnen doen ipv regexpen is de NS verwijderen:
PHP:
1
2
3
4
$xml -> loadXML('<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="test"><node /></root>
');
$xml -> firstChild -> removeAttributeNS('test', '');


Niet heel fraai maar dan werkt het tenminste :)

Sinds PHP 5.3.3 kun je overivens bij je query ook een NS opgeven, zelf nog niet getest, maar wellicht dat je daarmee verder komt?

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Shagura
  • Registratie: Augustus 2001
  • Laatst online: 07:38
Het enige dat ik weet dat werkt is je namespace registeren met een prefix bij je xpath object. Geen idee waarom dat nodig is, ik vind het ook nergens op slaan.

PHP:
1
2
3
4
5
6
7
8
9
<?php
$xml = new DomDocument();
$xml->loadXML('<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://test"><node /></root>
');

$xpath = new DOMXPath($xml);
$xpath->registerNamespace('m', 'http://test');
echo $xpath->query('m:node')->length;


zoeken naar 'node' zoekt schijnbaar naar een node element zonder namespace en niet een node element in de default namespace :|

Acties:
  • 0 Henk 'm!

  • Bastiaan V
  • Registratie: Juni 2005
  • Niet online

Bastiaan V

Tux's lil' helper

dit is standaard XML, erg makkelijk (als in onmisbaar) als je bijvoorbeeld data uit verschillende systemen haalt en deze berichten gaat samen voegen.
beide bronnen kunnen een element "Foo" hebben en iets heel anders betekenen. je kan dan a:Foo en b:Foo gebruiken om het verschil kenbaar te maken :).

veel (meest?) genruikt voorbeeld is de validatie van xml berichten (xsd's)

[ Voor 47% gewijzigd door Bastiaan V op 20-12-2010 22:37 . Reden: ik moet leren lezen, zie nu dat dit heel de vraag niet was :+ ]