Gå til innhold

php og DOM (XML)


Anbefalte innlegg

Videoannonse
Annonse
Gjest Slettet-df17e

Tror nok du må forklare litt nermere hva du lurer på. For jeg skjønte absolutt ikke hva du lurer på :)

 

Men parsing av XML filer er ikke så komplisert, nei.

 

En litt bedre tittel på tråden kunne også gjort susen.

Lenke til kommentar

Tror nok du må forklare litt nermere hva du lurer på. For jeg skjønte absolutt ikke hva du lurer på smile.gif

 

Men parsing av XML filer er ikke så komplisert, nei.

 

En litt bedre tittel på tråden kunne også gjort susen.

DOM står for document object model.. Det kan brukes til å kommunisere med et xml-dokument i likhet med sax.. tror jeg. forskjellen på det og sax er at med dom så hentes hele dokumentet inn i minnet og det kan hoppes frem og tilbake i dokumentet, og ikke trinnvis, som sax.. hvis jeg har forstått det riktig.

Lenke til kommentar

Det spørs nok veldig på hva du skal lagre, ytelsen kan jo bli et problem vis du skal lagre enorme mengder data, men samtidig kan nok ytelsen på noen områder være betydelig bedre vis man slipper database-serveren.

SQL har fordeler overfor DOM og Xpath, men XML tilbyr også fordeler tilbake igjen.

Kombinasjonen XML - XSL- XHTML glir jo veldig godt inn i et webmiljø, men har ingen fasit jeg.

 

SAX er vel egentlig litt på vei ut (?) og DOM har vertfall mye bedre støtte i PHP

Lenke til kommentar

Kan vise deg eksempel på skriving til XML-fil med DOM og skriving til mysql-database med de samme attributtene.

 

xml strukturen:

Klikk for å se/fjerne innholdet nedenfor
<atikler>
<artikkel id="" publisert="">
   <brukernavn></brukernavn>
   <overskrift></overskrift>
   <artikkelen></artikkelen>
   <kategori></kategori>
   <bilder>
     <bildene>
       <bilde id="" nummer=""/>
     </bildene>
   </bilder>
   <dato></dato>
   <tid></tid>
 </artikkel>
</artikler>

 

 

Skriving med DOM og php til xml-fila:

Klikk for å se/fjerne innholdet nedenfor
private function skriv_artikler() {
		# Henter post verdiene
		$kategori = $this->hent_kategori();
		$overskrift = $this->hent_overskrift();
		$artikkel = $this->hent_artikkel();
		$brukernavn = $this->admin->returner_innlogget_bruker();
		$bilde_array = $this->hent_bilder_array();
		if(isset($bilde_array)) {$bilde_id = 1;} else {$bilde_id = 0;}
		if(isset($_POST["publisere"])) {$publisert = 1;}
		else {$publisert = 0;}

		# Dato og tid for når artikkelen ble lagret
		$dato = date("d/m-Y");
		$tid = date("G:i:s");

		# Oppretter en instanse av domDocument			
		$dom_doc = new domDocument();

		# Overse mellomrom
		$dom_doc->preserveWhiteSpace = false;

		# Laster inn xml-filen
		$dom_doc->load("artikler.xml");			

		# Referer til rotnoden <artikler>
		$rotnode = $dom_doc->documentElement;

		# Oppretter en instanse XPath
		$xpath = new domXPath($dom_doc);

		# Sjekker om det <artikler> har barnenoder. Hvis ikke settes siste_id lik 0
		$har_barn = $rotnode->hasChildNodes();
		if($har_barn) {
			# Sjekker om det finnes en <artikkel> med id lik 2. Hvis ikke settes siste_id lik 1
			$bruker_id = $xpath->query("//artikkel[@id='2']")->item(0)->nodeValue;
			if(empty($bruker_id)) {$siste_id = 1;}
			else {			
				# Henter den siste id-verdien til artiklene <artikkelen>
				$siste_id = $rotnode->lastChild->getAttribute("id");
			}
		}
		else {$siste_id = 0;}

		# Oppretter nodene
		$ny_artikkel = $rotnode->appendchild(new domElement("artikkel")); // <artikkel>
		$ny_artikkel->setAttribute("id", $siste_id+1); // attributt id til <artikkel>
		$ny_artikkel->setAttribute("publisert", $publisert); // attributt publisert til <artikkel>
		$ny_artikkel->appendchild(new domElement("brukernavn", utf8_encode($brukernavn))); // <brukernavn>
		$ny_artikkel->appendchild(new domElement("overskrift", utf8_encode($overskrift))); // <overskrift>
		$ny_artikkel->appendchild(new domElement("artikkelen", utf8_encode($artikkel))); // <artikkelen>			
		$ny_artikkel->appendchild(new domElement("kategori", $kategori)); // <kategori>
		$bilder = $ny_artikkel->appendChild(new domElement("bilder")); // <bilder>
		if(isset($bilde_array)) {
			foreach($bilde_array as $bilde) {
				$nummer += 1;
				$bildene = $bilder->appendChild(new domElement("bildene")); // <bildene>
				$bilde_node = $bildene->appendchild(new domElement("bilde", utf8_encode($bilde))); // <bilde>
				$bilde_node->setAttribute("id", $bilde_id); // attributt id til <bilde>
				$bilde_node->setAttribute("nummer", $nummer); // attributt nummer til <bilde>
			}
		}
		$ny_artikkel->appendchild(new domElement("dato", $dato)); // <dato>
		$ny_artikkel->appendchild(new domElement("tid", $tid)); // <tid>


		# For å få en fin utputt i xml-dokumentet
		$dom_doc->formatOutput = true;

		# Lagrer filen
		$dom_doc->save("artikler.xml");					
	}

 

 

Insetting ved hjelp av php til mysql database:

Klikk for å se/fjerne innholdet nedenfor
$artikkel = mysql_query("INSERT INTO `artikler` (`id` , `brukernavn` , `artikkelen` , `kategori` , `dato` , `tid`)
VALUES ('' , '$brukernavn' , '$artikkelen' , '$kategori' , '$dato' , '$tid')") or die ("Problem med innsetting av ny artikkel");

$bilder = mysql_query("INSERT INTO `bilder` (`id` , `bilde` , `artikkelid`)
VALUES ('' , '$bilde' , '$artikkelid')") or die ("Feil ved innsetting av bilde");

 

 

Det å lagre til xml-filer ved hjelp av DOM og php er ikke komplisert. Det kan bare ta litt tid før du får kontroll over det hele. Men da dette er gjort er det mer smak og behag i følge meg over hva du velger. Litt mer å skrive enn ved lagring til en database.

Lenke til kommentar

Nåja, det XML-eksempelet ditt var da unødvendig rotete.

Eksempelet mitt nedenfor laster en eksisterende XML-fil , legger til en ny artikkel og lagrer filen igjen:

<?php
$xml = new SimpleXMLElement('artikler.xml', null, true);
$artikkel = $xml->addChild("artikkel");
$artikkel->brukernavn = 'Ola';
$artikkel->overskrift = 'Test';
$artikkel->aritkkelen = 'Hei på deg!';
$artikkel->kategori = 'Test';
$artikkel->bilder->bilde = 'bilde.jpg';
$artikkel->dato = '2007-03-29';
$artikkel->tid = '15:55';
file_put_contents('artikler.xml', $xml->asXml());
?>

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...