[PHP] Grote XML-file effectief inlezen (cache? opdelen?)

Pagina: 1
Acties:
  • 302 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ik zou graag gebruik maken van een groot XML-bestand(en), welk ik als een soort database/table gebruik. Probleem is echter dat het natuurlijk niet effectief is om steeds het hele bestand weer in te lezen. Wel wil ik selecties kunnen maken (liefst in de vorm van XPath/XQuery).

Een paar alternatieven die ik zo had verzonnen

- Per diepte/level van nesting een apart bestand aanmaken. Vb. van hoe dat er uit zou komen te zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
index.xml
<data>
   <parent standaard="attribuut" enextra="voordataref" ref_id="1_8473" />
   <parent standaard="attribuut" enextra="voordataref" ref_id="1_8474" />
   <parent standaard="attribuut" enextra="voordataref" ref_id="1_8478" />
</data>

en dan daaronder
1_8473.xml
<parent standaard="attribuut" enextra="voordataref" ref_id="1_8473">
   <child ref_id="2_648" />
</parent>

2_648.xml
<child ref_id="2_648">
   hier content
</child>

Nadeel is hiervan dat het heel veel bestaan worden. Misschien wel zoveel dat ik me afvraag of er nog wel performance-winst zal zijn. Daarnaast is het niet zeer dynamisch, zeker niet bij mutaties of toevoegingen.

- De elementen in een soort indexbestand opslaan, en de content in een ander bestand
code:
1
2
3
4
5
6
7
8
9
10
11
12
<data>
   <parent standaard="attribuut" enextra="voordataref">
       <child>
           $3d8a2c4fec
       </child>
   </parent>
   <parent standaard="attribuut" enextra="voordataref" />
   <parent standaard="attribuut" enextra="voordataref" />
</data>

$3d8a2c4fec.dat
Hier een boel content, wat een lange lap zijn bijvoorbeeld een topicstart met een boel gel*l

Voordelen zijn dat je kunt Queryen. Het aantal bestanden waarschijnlijk beperkt blijft etc. Nadelen zijn er echter ook, bijvoorbeeld dat het indexbestand nog best groot zal zijn ws.

- Daarnaast had ik nog iets bedacht met de posities van de elementen in het bestand opslaan in een indexbestand oid. en dan slechts beperkte stukken de pointer plaatsen en inlezen. Zodoende hoef je niet het hele bestand in te lezen, maar loop je misschien wel tegen problemen aan met parsen. Moet ik nog uitwerken, eerst even eten :)
Iemand ervaringen mee of goede ideeën hiervoor? Ik zocht ook XML-databases naar ditzelfde idee, maar die kon ik niet voor PHP vinden, wel voor Java.

edit:
gevonden:
link

[ Voor 12% gewijzigd door r0bert op 01-12-2005 19:10 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Iemand die een (native) XML-database weet voor PHP?
Of iemand die ideeën heeft hoe het bovenstaande te realiseren is? Mn. 2e manier denk ik maar...

Acties:
  • 0 Henk 'm!

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
xml db's:
http://exist.sourceforge.net/
http://www1.softwareag.co...oducts/tamino/default.asp

maar die had je misschien zelf ook al gevonden .. met google :)

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Ja, maar ik vind alleen maar JAVA XML db's.. Allemaal WAR/JAR files of dat ik weer niet via PHP kan communiceren, maar met JAVA moet :/. Bij DBXML had ik iets gevonden dat er een php-module voor zou bestaan, maar die is nergens te vinden.

[ Voor 8% gewijzigd door r0bert op 02-12-2005 12:12 ]


Acties:
  • 0 Henk 'm!

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024

Acties:
  • 0 Henk 'm!

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
Het lijkt een beetje dat ik exist promoot :P, maar ik ken het hele ding niet hoor.

ikzelf werk met .net en ms-sql.
als ik xml uit de database wil, maak ik stored procedures die xml teruggeven. De aanroep van die stored procedures gaat dan op de normale manier.

Ik heb het nog niet geprobeerd, maar het schijnt een eitje te zijn om sql2005 te benaderen als webservice. Dan kan je al je data relationeel bewaren en query-en, maar toch als xml gebruiken in je app. http://www.google.nl/sear...ver+2005+webservice&meta=

in sommige gevallen is het handig om die xml-features te gebruiken, in andere gevallen is het weer handig om old-skool te werken.
Volgens mij is het een lastige weg om zelf een soort file-system-based xml query-systeem te maken. Is het al niet om de technische moeilijkheid, dan is het wel voor de performance.

In .net kan je op verschillende manieren met xml omgaan. Afhankelijk van wat je van plan bent wordt ook aangeraden om andere classen te gebruiken (http://msdn.microsoft.com.../html/scalenetcheck10.asp).

Om handig met xml te werken zijn er veel oplossingen, maar in PHP ken ik er niet zo veel ...

Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
je zou eens naar xinclude kunnen kijken. zelf nooit mee gewerkt (mijn xml-trees zijn nooit te groot om in 1 keer te behappen), maar afhankelijk van wat je wilt zou dit misschien van toepassing zijn.

http://www.w3.org/TR/xinclude/
http://nl2.php.net/manual...-domdocument-xinclude.php

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
@Joopst.
Punt dat ik deze manier wou gebruiken, is omdat de pagina's veel opgevraagd zullen worden, vaak dezelfde combinatie van delen van PHP bestanden. Om daarvoor steeds de DB te querien lijkt me zo overdone.

SQL bestaat idd de mogelijkheid om met XML te werken, heb ik ook gevonden. Ik heb helaas niet de beschikking over een machine met SQL.

Over Exist, nee die had ik niet gevonden! En was ik zeker wel naar op zoek! Ik ga er meteen na het eten eens mee aan de slag! Laat het horen.

Verder is .net niet echt voor mij weggelegd. Heb hier geen kennis van, en ben al met Java+JSP bezig en daarnaast nog een opleiding. Zoveel kan ik niet aan :)

@tech-no-logical: Ik moet me er nog even in verdiepen, maar wordt daar ook niet gewoon het hele document ingelezen?

Ah ik snap wat je bedoeld! Dat ipv die "vieze" $2_3457"! Ok, dat is iets wat ik zou kunnen uitwerken. Maar zit dan misschien nog wel met het muteren. Eerst nog even kijken hoe dat Exist presteerd.

[ Voor 14% gewijzigd door r0bert op 02-12-2005 13:15 ]


Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
Dat Exist moet alsnog geinstalleerd worden op een Java server, waar ik alleen een Apache servertje met PHP heb. Ik denk dat ik met dat alles wacht tot ik Java/JSP goed onder de knie heb.

Over XInclude, dat kan best een oplossing zijn als ik dat uitwerk denk ik. Ik loop alleen nu al tegen een probleem. Ik gebruik de volgende XML:
XML:
1
2
3
4
5
6
7
<forum id="1" xmlns:xi="http://www.w3.org/2001/XInclude">
   <xi:include href="1.xml#xpointer(topic[@id='1_242']/*)" parse="xml" encoding="utf-8">
    <xi:fallback>
        <error>Query kon niet worden uitgevoegd</error>
    </xi:fallback>
   </xi:include>
</forum>

Als die include zou mislukken, zou ik dus een fallback-message moeten krijgen, maar daar gaat het fout. Ik krijg de melding:
code:
1
2
3
4
5
Warning: XPointer evaluation failed: #xpointer(topic[@id='1_242']/.) in 
Z:\www\onlinemeppel.nl\__redesign_xml\test.php on line 4

Warning: could not load file:///Z:/www/test/__redesign_
xml/1.xml#xpointer(topic[@id='1_242']/.), and no fallback was found in

Het zijn maar warning, maar ik krijg geen <error>...</error> ook niet in de source. Stukje code wat ik gebruik:
PHP:
1
2
3
4
$oDom = new DomDocument("1.0");
    $oDom->load('./index.xml');
    $oDom->XInclude();
        echo $oDom->saveXML();


e: Het gaat me dus niet om de fout (dat is dat het opgevraagde topic niet bestaat), maar dat ik geen error krijg die ik wel gedefinieerd heb.

[ Voor 33% gewijzigd door r0bert op 02-12-2005 17:07 ]


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

XML is meer voor data uitwisseling bedoelt tussen bijvoorbeeld 2 systemen dan voor gebruik als database.

Indien je PHP5 gebruikt zou je eens kunnen kijken naar simpleXML , een geweldige functie vind ik zelf voor het inlezen van xml bestanden.

http://www.php.net/simpleXML

[ Voor 7% gewijzigd door aex351 op 02-12-2005 21:17 ]

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
het zoeken op xpointer ID's (wat jij hier probeert) werkt alleen wanner het id-attribuut ook echt een XML-ID is, zoals bijvoorbeeld gedefinieerd door een DTD...

<!DOCTYPE forum [ <!ATTLIST topic id ID #REQUIRED> ]>

ervan uitgaande dat het root-element van je ge-include xml 'forum' is, zou deze DTD moeten werken als je 'm erin copy-paste. eventueel het ID definieren met een schema zou ook moeten werken. maar het moet iig een 'gevalideerd' document zijn. wil je dat niet, dan heb je alleen de 'element()' selector beschikbaar binnen je xpointer : element(/1/1) geeft dan het eerste kind van het eerste kind (bijvoorbeeld).

ik kan het mis hebben, ik heb 't ook maar even snel getest, maar dit was wat mij duidelijk werd uit de tutorials voor xinclude / xpointer bij http://www.zvon.org

Acties:
  • 0 Henk 'm!

Verwijderd

Kijk ook eens naar SDO (http://nl2.php.net/sdo) - sinds php5.1, inclusief XML data access service.

Acties:
  • 0 Henk 'm!

  • r0bert
  • Registratie: September 2001
  • Laatst online: 30-07 02:32
aex351 schreef op vrijdag 02 december 2005 @ 21:17:
XML is meer voor data uitwisseling bedoelt tussen bijvoorbeeld 2 systemen dan voor gebruik als database.
Kan, maar ik wil het dus als tijdelijk opslag gebruiken (idee client server/xml archief).
Indien je PHP5 gebruikt zou je eens kunnen kijken naar simpleXML , een geweldige functie vind ik zelf voor het inlezen van xml bestanden.

http://www.php.net/simpleXML
Ja, die functie ken ik en die gebruikte ik hiervoor al. Het gaat mij er meer om dat dat niet efficient is als je uit "grote" xml bestanden maar een klein deel nodig hebt, en daar zoek ik een goede oplossing voor. :)
tech-no-logical schreef op vrijdag 02 december 2005 @ 21:25:
het zoeken op xpointer ID's (wat jij hier probeert) werkt alleen wanner het id-attribuut ook echt een XML-ID is, zoals bijvoorbeeld gedefinieerd door een DTD...

<!DOCTYPE forum [ <!ATTLIST topic id ID #REQUIRED> ]>
....
Maar het werkt wel, dat is niet het probleem. Het probleem zit 'm in de verwerking door PHP. (DomDocument->XInclude), die pakt de xi:fallback niet om een error weer te geven.
Verwijderd schreef op zaterdag 03 december 2005 @ 01:33:
Kijk ook eens naar SDO (http://nl2.php.net/sdo) - sinds php5.1, inclusief XML data access service.
Niet dat ik lui ben ofzo, en ook bedankt voor de link, maar wat is hier het voordeel aan boven domdocument? Efficienter?
Pagina: 1