Käsittelyssä on seuraavanlainen xml-dokumentti:
sisalto.xml <tekstisisalto> <sivu1> <paaotsikko>Pääotsikko</paaotsikko> <teksti> <kappale>Teksti1, kappale1</kappale> </teksti> <valiotsikko>Väliotsikko1</valiotsikko> <teksti> <kappale>Teksti2, kappale1</kappale> <kappale>Teksti2, kappale2</kappale> </teksti> </sivu1>
Tarkoituksena on hakea sivuille ensin pääotsikko ja sitten järjestyksessä ensimmäisestä tekstistä kappaleet eroteltuna kahdella rivinvaihdolla, väliotsikko ja sen jälkeen taas kappaleet eroteltuna kahdella rivinvaihdolla toisistaan. Väliotsikoiden hakeminen onnistuu seuraavalla koodilla:
<?php $dom = new DomDocument(); $dom->load(sisalto.xml); $sisalto = $dom->getElementsByTagName("sivu1"); $valiotsikot = $sisalto->item(0)->getElementsByTagName("valiotsikko"); foreach ($valiotsikot as $node) { $votaulu[] = $node->textContent; } ?>
Idea tässä välissä on, että kun myös tekstit on haettu tauluun $txttaulu[$txtIndex][$kplIndex], niin tekstit ja väliotsikot voidaan tulostaa vuorotellen nettisivuille.
Ongelmana on, etten saa haettua kappaleita yhtään mitenkään. Muunmuassa näin olen sitä yrittänyt:
<?php $pituus = 0; $tekstit = $sisalto->item(0)->getElementsByTagName("teksti"); foreach ($tekstit as $teksti) { $pituus++; } //pituus tulostuu oikein for ($i = 0; $i < $pituus; $i++) { $kappaleet = $tekstit->item($i)->getElementsByTagName("kappale"); /* Tähän asti toimii, mutta ilmeisesti $kappaleet ei saa mitään arvoja, koska ohjelma ei mene foreach-silmukkaan */ foreach ($kappaleet as $kpl) { $ktaulu[$i][] = $kpl->textContent; } } ?>
Eikö dom, xml tai php hyväksy montaa getElementsByTagName-käskyä peräkkäin? Kahdestihan näitä kuitenkin jo kutsutaan, miksi kolmas tuottaisi ongelmia?
Testasin noilla antamillasi koodeilla ja kyllä se tonne foreachiin menee, kunhan muistat heittää heittomerkit loadin parametriin ja sulkea tekstisisalto-tagin.
Huom, on olemassa myös XLS transformointi. Eli oikeallaisella XSL-style sheetillä voidaan muuntaa haluttu XML-dokumentti esimerkiksi HTML-dokumentiksi.
En tiedä PHP:lle XLST prosessoria mutta Javalle niitä on useampia kuten Apache Xalan.
Tsuriga, mainitsemasi asiat ovat oikein alkuperäisessä koodissa, ensimmäisen viestini koodiin on siinä kohtaa tullut virhe. Homma ei silti minulla toimi. Olisikohan kyse taas jostain palvelimen oikeuksista tms. Pitää siis kokeilla toisella palvelimella. Kiitos testauksesta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.