Toon posts:

[XML] php XPath ?!@#!

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heeft iemand wel eens gewerkt met php XPath?

http://sourceforge.net/projects/phpxpath

Het lijkt interessant op zich maar ik heb er wat problemen mee.

Neem dit XML document:
code:
1
2
3
4
5
<?xml version="1.0"?>
<channelconfiguration>
  <marco>waarde</marco>
  <anton>nog wat</anton>
</channelconfiguration>

Als ik doe:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?

include_once("XPath.php");

$objTest = new XPath("testfile.xml");

$objTest->setCaseFolding($onOff = "FALSE");

$foo = $objTest->getData("/channelconfiguration/anton");

echo "Ik heb $foo";

$objTest->appendChild("/channelconfiguration/anton", "antonchild");

?>

Dan zegt het eerste stuk netjes :

Ik heb nog wat

Maar de appendChild() functie geeft de error:

XPath error in XPath.php:1344 The supplied string does not uniquely describe a node in the xml document:

Snapt iemand waarom dit niet werkt?
Met precies dezelfde XPath expressie kan ik WEL data lezen maar geen child toevoegen...

Verwijderd

Topicstarter
Ik heb uitgevonden hoe het werkt :)

Omdat het misschien leuk voor mensen is zal ik mijn testscriptje even met jullie delen.
Het gave hieraan is dat je er op een fatsoenlijke manier XML mee kunt lezen, bewerken en aanmaken zonder dat je de nog zwaar experimentele php xml DOM parser nodig hebt!

Gaat ie:
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
<?

include_once("clsXPath.php");

$objTest = new XPath();
$xmlstring = "<channelconfiguration></channelconfiguration>";
$objTest->setCaseFolding($onOff = "FALSE");

$objTest->importFromString($xmlstring);

//$foo = $objTest->nodeName("/channelconfiguration/child[@num='1']");

echo "Ik heb $foo";

$tester = $objTest->hasChildNodes('/channelconfiguration[1]');

echo $tester;
$objTest->appendChild("/channelconfiguration[1]", "foo");
$objTest->appendChild("/channelconfiguration[1]", "foo");
$objTest->appendChild("/channelconfiguration[1]", "foo");
$objTest->appendChild("/channelconfiguration[1]", "foo");

$objTest->setAttribute("/channelconfiguration/foo[1]", "number", "1");
$objTest->setAttribute("/channelconfiguration/foo[4]", "number", "4");

$objTest->appendChild("/channelconfiguration[1]/foo[3]", "foochild");
$objTest->appendData("/channelconfiguration/foo[2]", "FOO DATA");
// this construction works
// $objTest->appendChild("/channelconfiguration[1]/child[2]/anton[1]", "foo");

$objTest->exportToFile("/tmp/testfile", '/', '<?xml version="1.0"?>')


?>

Dit heeft de volgende xml file gemaakt:
code:
1
2
3
4
5
6
7
8
<?xml version="1.0"?><channelconfiguration>
  <foo number="1"/>
  <foo>FOO DATA</foo>
  <foo>
    <foochild/>
  </foo>
  <foo number="4"/>
</channelconfiguration>

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
oh dit is gewoon de opvolger van die lib van phpxml.org, <phpxml/>...
nou ik heb eens vergeleken hoe snel die is ivm php_domxml...nou, extreem traag, vooral wat het resolven XPath expressies betreft. Php_domxml is idd nog steeds experimenteel, lekt veel geheugen op mijn Win2000 dev. bak, maar we draaien al geruime tijd zonder problemen een script dat zwaar op php_domxml hangt op een Linux server (waar het geen geheugen lekt).
maar, wel leuk voor kleine dingetjes op virtual hosts waar je geen extra phplibs tot je beschikking hebt!

Verwijderd

Topicstarter
Op vrijdag 02 november 2001 14:02 schreef Genoil het volgende:
oh dit is gewoon de opvolger van die lib van phpxml.org, <phpxml/>...
nou ik heb eens vergeleken hoe snel die is ivm php_domxml...nou, extreem traag, vooral wat het resolven XPath expressies betreft. Php_domxml is idd nog steeds experimenteel, lekt veel geheugen op mijn Win2000 dev. bak, maar we draaien al geruime tijd zonder problemen een script dat zwaar op php_domxml hangt op een Linux server (waar het geen geheugen lekt).
maar, wel leuk voor kleine dingetjes op virtual hosts waar je geen extra phplibs tot je beschikking hebt!
Mijn redenering is (voor een produktieomgeving) de volgende:

Ik kan als ik dit wil doen in feite 3 oplossingen kiezen:

1) php DOM XML (experimenteel en er ligt nog niks vast qua API)
2) binnen PHP de java XERCES klasses instantieren en die gebruiken. Dit werkt leuk alleen het instantieren is baggertraag, nog VEEL trager dan deze lib
3) deze lib gebruiken en misschien niet het snelste maar wel het stabielste gebruiken. (puur PHP, geen extra laag introduceren in de vorm van een java VM, geen experimentele code)

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
mja, ik snap die keuze ook wel, maar ik kan me nog herinneren dat ik een tijdje op de mailinglist van phpxml zat , en daar waren de bugreports anders ook niet van de lucht! En wat boeit het nou helemaal dat zo'n API per PHP release nou een beetje verandert, als je gewoon zorgt dat je die xml functies in een mooi wrappertje gooit heb je binnen no-time je script weer op orde. Zo ben ik ook ooit eens van <phpxml/> overgestapt op php_domxml :)