XML i PHP. Denne artikel gennemgår kort nogle af de mange muligheder for brug af XML i PHP. Det sker ved brug af eksempler. Eksemplerne kræver PHP 5.

Relaterede dokumenter
Denne artikel gennemgår kort nogle mulighederne for brug af XML i ASP. Det sker ved brug af eksempler. Eksemplerne vil være i VBS.

Den forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET.

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

Mere XML i Java. Denne artikel beskriver brug af XML i Java udover parsning (som er beskrevet i artiklen "XML parsning i Java").

Nye Java XML API'er

Eksempel på transformation: XML -> RTF dokument:

Kontrol-strukturer i PHP

Arkitektur for begyndere

Afsending af s vha. ASP

DOM Document Object Model:

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Ratingsystem i PHP og MySQL

Med register_globals = On får du automatisk adgang til en række variabelnavne i dit script.

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

At klippe en streng over på det mest hensigtsmæssige sted

I denne arktikle går jeg gennem Slet, Ret og Opret data i en MySQL database. der er også en lille del i den hvor den postere datanen ud i en løkke

Gæstebog med validering opbygget med MySQL

Simpel upload af filer

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

JSP, Tomcat. Tutorial lavet af Jákup W. Hansen TSU semester 10.october 2007

SAX Simple API for XML.

I mit script tager jeg højde for det problem ved, at gemme et unikt tal mellem 0-9 på 6 cifre og derved vil de så blive vist som 2 online.

Loginsystem (med MySQL)

Webserverprogrammering

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

Database design for begyndere

Endnu mere om tilfældige tal

Begrynder til at lave log ind system

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

I denne artikel vil jeg gennemgå hvordan en side for RSS "Live Bogmærke" kan se ud.

Tagwall med Php & MySQL

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

Indholdsfortegnelse If-sætningen... 3 Opgaver... 4 OR, AND sammen med if-sætningen... 5 Rand() funktion... 5 Opgave... 5 Include() funktionen...

Introduction til.net remoting i VB.NET

Uploade billeder eller andre filer ved hjælp af php og mysql

applikation----x----odbc driver manager----foobar ODBC driver----foobar database

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Bilag 10. Dataindhold i SUP-databaser. Udkast af 12. juni Udarbejdet for. SUP-Styregruppen

Introduction til.net remoting i C#

Upload af billeder/filer for nybegyndere Del. 2

Dynamisk PHP design OPDATERET

DM507 Algoritmer og datastrukturer

Introduktion til funktioner, moduler og scopes i Python

The Design Diaries Project 3 2. Semester. Blog om designprincipper

PHP Snippets. De små korte. Skrevet af Daniel Pedersen

Procesbeskrivelse - Webprogrammering

Session-highjack...et halvt skridt mod en modgift

Singleton pattern i Java

Form og dens underlige box model

PHP guide af Daniel Pedersen

Start på javascript. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 03. Feb 2009 af webstuff I kategorien Programmering / JavaScript

Namespaces. Vi kan kvalificere elementer på denne måde: <?xml version="1.0" encoding="iso "?>

Log ind med PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 09. May 2011 af dab93 I kategorien Programmering / Andre

Bits, bit operationer, integers og floating point

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det.

DM507 Algoritmer og datastrukturer

Sådan kan du sende data fra din egen hjemmeside til JitBesked via en HTML-JDF.

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

Hvad er Objekter - Programmering

Introduktion til SQL queries

Java web applikationer med Tomcat

DM507 Algoritmer og datastrukturer

Forskellige Java versioner

Flerbruger miljø, opdel database

Password hashing og salt

jquery - selectors, attributes, traversing og manipulation

Arrays i PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 04. Feb 2009 af taskmgr I kategorien Programmering / PHP

Loginsystem med PHP4, klasser, sessions og MySQL database

Encoding:...1 Et tegn sæt (character set):...1 UTF-8 og UTF-16 (Unicode):...2

Regulære udtryk, 2. del

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Singleton pattern i C#

Web 2.0. World Wide Web (www)

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Dette er en grundlæggende artikel til hvordan du laver et lille community, med forskelige

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

Logging i Java. Den forudsætter kendskab til Java og noget generel udviklings erfaring. Denne guide er oprindeligt udgivet på Eksperten.

Anvendelse af metoder - Programmering

OBJECT IDENTIFICERES OID PHMR

PHP Quick Teknisk Ordbog

IT projekt person galleri

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Database for udviklere. Jan Lund Madsen PBS10107

Øvelse 6. Modeller Oprettelse af og arbejde med modeller Videre øvelser Øvelser i eget projekt 87

SESSION med PHP. En let begynderguide som kan føre dig ind i en verden af muligheder. Denne guide er oprindeligt udgivet på Eksperten.

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Java Klasse nedarvninger

SAX Simple API for XML.

Programmering I Java/C#

Hvorfor skal vi bruge objekt orienteret databaser?

Reeksamen, DSDS, forår 2008

Database tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk

Extension udvikling i Mozilla Firefox. Henrik Gemal

I denne manual kan du finde en hurtig introduktion til hvordan du:

Transkript:

Denne guide er oprindeligt udgivet på Eksperten.dk XML i PHP Denne artikel gennemgår kort nogle af de mange muligheder for brug af XML i PHP. Det sker ved brug af eksempler. Eksemplerne kræver PHP 5. Den forudsætter et vist kendskab til både XML og PHP. Skrevet den 14. Feb 2010 af arne_v I kategorien Programmering / PHP Historie: V1.0-29/12/2008 - original V1.1-14/02/2010 - smårettelser Indledning Der er mange XML extensions i PHP. Jeg vil vise eksempler på brug af: DOM Simple XML XML reader XML writer XSL Eksemplerne forudsætter PHP 5 og brug af OOP. Der findes nogle XML extensions i PHP 4, men disse er ikke kompatible med de ovennævnte. Og da PHP 4 er forældet nu vil jeg ikke bruge tid på dem. For fuld dokumentation af PHP XML extensions se: http://www.php.net/manual/en/refs.xml.php For hurtig intro til XML terminologi se: http://www.eksperten.dk/guide/627 "XML hvad, hvorfor og hvornår?" Gennemgangen af XML extensions vil i høj grad basere sig på simple eksempler der illusterer tankegangen bag en given extension og hvordan man kan komme igang. Til praktisk brug er flere funktioner formentligt nødvendige, men dem kan man slå op i dokumentationen (se link ovenfor). Eksemplerne nedenfor vil bruge følgende simple XML fil som input: test.xml <?xml version='1.0' standalone='yes' <medlemmer> <medlem no="1"> <navn>niels Nielsen</navn> <adresse>nellikevej 19</adresse> </medlem>

<medlem no="2"> <navn>jens Jensen</navn> <adresse>jagtvej 17</adresse> </medlem> <medlem no="3"> <navn>ole Olsen</navn> <adresse>omfartsvejen 13</adresse> </medlem> </medlemmer> Den genererede HTML i eksemplerne er ikke speciel advanceret, men formålet er at vise XML processing ikke HTML generering (og så er jeg iøvrigt ikke specielt HTML kyndig). DOM DOM extension bygger på den W3C standardiserede DOM model som også kendes fra JavaScript, ASP, Java,.NET etc.. Hele XML filen indlæses i et hierakisk træ, hvor elementer/attributter/text er children til et element. Vær opmærksom på at et DOM træ fylder mere i memory end XML filen. DOM er derfor ikke en god løsning til meget store XML filer (3 cifrede MB eller GB størrelser). Metoderne til at tilgå dette træ er standardiserede, så man kan genbruge sin viden fra andre sprog i PHP. Først et eksempel som viser en XML fil som en HTML TABLE ved at løbe igennem træet på meget traditionel vis. showdom.php <title>dom demo</title> <table border="1"> <tr> <th>no</th> <th>navn</th> <th>adresse</th> </tr> $doc = new DOMDocument(); // indlæs XML fil i DOM træ $doc->load('test.xml'); // find alle medlem elementer $medlemmer = $doc->getelementsbytagname('medlem');

foreach($medlemmer as $medlem) { echo "<tr>\r\n"; // find og udskriv attribut no echo "<td>". $medlem->attributes->getnameditem('no')->nodevalue. "</td>\r\n"; // find alle under elementer foreach($medlem->childnodes as $elm) { // find under element navn if($elm->nodename == 'navn') $navn = $elm->nodevalue; // find under element adresse if($elm->nodename == 'adresse') $adresse = $elm->nodevalue; // udskriv de fundne under elementer echo "<td>$navn</td>\r\n"; echo "<td>$adresse</td>\r\n"; echo "</tr>\r\n"; </table> Så et eksempel der viser, hvordan man kan søge i en XML fil med XPath. Jeg vil ikke gå i detaljer med hensyn til XPath syntax det kan man og det er der skrevet bøger om. Den ultra korte version er: xxxx - finder elementer med navn xxxx //xxxx/yyyy - finder elementer med navn yyyy under elementer med navn xxxx xxxx[yyyy='abc'] - finder elementer med navn xxxx som har et under element med navn yyyy og en tekstværdi 'abc' xxxx[@yyyy=123] - finder elementer med navn xxxx som har en attribut med navn yyyy og en talværdi 123 searchdom.php <title>dom og XPath demo</title> if(isset($_post['no'])) { $no = $_POST['no']; $doc = new DOMDocument(); // indlæs XML fil i DOM træ $doc->load('test.xml'); // opret XPath objekt $xpath = new DOMXPath($doc);

// søg efter medlemmer med det angivne no $medlemmer = $xpath->query("//medlemmer/medlem[@no=$no]"); // test om der var nogen matchende medlemmer if($medlemmer->length > 0) { // tag det første matchende medlem $medlem = $medlemmer->item(0); // udskriv attribut no echo "no=". $medlem->attributes->getnameditem('no')->nodevalue. "<br/>\r\n"; // søg efter sub element navn og udskriv det echo "navn=". $xpath->query("navn/text()", $medlem)->item(0)->nodevalue. "<br/>\r\n"; // søg efter sub element adresse og udskriv det echo "adresse=". $xpath->query("adresse/text()", $medlem)->item(0)->nodevalue. "<br/>\r\n"; else { echo "Ingen fundet<br/>\r\n"; <form method="post"> No: <input type="text" name="no"/> <br/> <input type="submit" value="søg"/> </form> Eksempel på at rette i XML dokument (og returnere XML fremfor HTML). changedom.php header("content-type: text/xml"); $doc = new DOMDocument(); // indlæs XML fil i DOM træ $doc->load('test.xml'); // opret XPath objekt $xpath = new DOMXPath($doc); // søg efter medlem med no 2 $medlemmer = $xpath->query("//medlemmer/medlem[@no=2]"); $medlem = $medlemmer->item(0); // fjern medlem $medlem->parentnode->removechild($medlem); // tilføj medlem $navn = $doc->createelement('navn'); $navn->appendchild($doc->createtextnode('lars Larsen')); $adresse = $doc->createelement('adresse'); $adresse->appendchild($doc->createtextnode('ledvej 14')); $nytmedlem = $doc->createelement('medlem');

$nytmedlem->setattribute('no', '4'); $nytmedlem->appendchild($navn); $nytmedlem->appendchild($adresse); $doc->documentelement->appendchild($nytmedlem); // udskriv DOM træ som XML echo $doc->savexml(); Eksempel på at oprette et nyt XML dokument (og returnere XML fremfor HTML). createdom.php header("content-type: text/xml"); $doc = new DOMDocument(); // opret document element og 3 sub elementer $one1 = $doc->createelement('one'); $one1->appendchild($doc->createtextnode('a')); $one2 = $doc->createelement('one'); $one2->appendchild($doc->createtextnode('bb')); $one3 = $doc->createelement('one'); $one3->appendchild($doc->createtextnode('ccc')); $root = $doc->createelement('all'); $root->appendchild($one1); $root->appendchild($one2); $root->appendchild($one3); $doc->appendchild($root); // udskriv DOM træ som XML echo $doc->savexml(); DOM er yderst fleksibelt, men har en lidt halvtung syntax. Simple XML Simple XML har også hele XML filen i memory, men man tilgår elementer og attributter som PHP objekter. Eksempel som viser en XML fil som en HTML TABLE. showsimple.php <title>simple XML demo</title>

<table border="1"> <tr> <th>no</th> <th>navn</th> <th>adresse</th> </tr> // opret simple struktur og indlæs XML fil $xml = new SimpleXMLElement(file_get_contents('test.xml')); // find alle medlem elementer foreach($xml->medlem as $medlem) { echo "<tr>\r\n"; // find og udskriv attribut no echo "<td>". $medlem['no']. "</td>\r\n"; // find og udskriv sub element navn echo "<td>". $medlem->navn. "</td>\r\n"; // find og udskriv sub element adresse echo "<td>". $medlem->adresse. "</td>\r\n"; echo "</tr>\r\n"; </table> Eksempel der viser, hvordan man kan søge i en XML fil med XPath. searchsimple.php <title>simple XML og XPath demo</title> if(isset($_post['no'])) { $no = $_POST['no']; // opret simple struktur og indlæs XML fil $xml = new SimpleXMLElement(file_get_contents('test.xml')); // søg efter medlemmer med det angivne no $medlemmer = $xml->xpath("//medlemmer/medlem[@no=$no]"); // test om der var nogen matchende medlemmer if(count($medlemmer) > 0) { // tag det første matchende medlem $medlem = $medlemmer[0]; // udskriv attribut no echo "no=". $medlem['no']. "<br/>\r\n"; // udskriv sub element navn echo "navn=". $medlem->navn. "<br/>\r\n"; // udskriv sub element adresse echo "adresse=". $medlem->adresse. "<br/>\r\n";

else { echo "Ingen fundet<br/>\r\n"; <form method="post"> No: <input type="text" name="no"/> <br/> <input type="submit" value="søg"/> </form> Som man kan se er simple XML syntaxen noget nemmere end DOM syntaxen. Bemærk dog at simple XML ikke er så godt til at ændre/oprette XML dokumenter med. Og brug af simple XML til XML med namespaces er også kendt for at give store problemer. XML reader XML reader er en event driven pull parser, som kan processe en XML fil uden at læse det hele ind i memory og er derfor velgnet til at processe meget store XML filer med. Eksempel som viser en XML fil som en HTML TABLE. showreader.php <title>xml reader demo</title> <table border="1"> <tr> <th>no</th> <th>navn</th> <th>adresse</th> </tr> // opret reader og åben XML fil $rdr = new XMLReader(); $rdr->xml(file_get_contents('test.xml')); // læs hele filen while($rdr->read()){ // test på node type switch ($rdr->nodetype) { case XMLReader::TEXT: // gem text til senere

$s = $rdr->value; break; case XMLReader::ELEMENT: if($rdr->localname == 'medlem') { // hvis start på medlem element så hent attribut no $no = $rdr->getattribute('no'); break; case XMLReader::END_ELEMENT: if($rdr->localname == 'navn') { // hvis start på navn element så hent gemt text $navn = $s; else if($rdr->localname == 'adresse') { // hvis start på adresse element så hent gemt text $adresse = $s; else if($rdr->localname == 'medlem') { // hvis slut på medlem element så udskrive alt echo "<tr>\r\n"; // udskriv attribut no echo "<td>". $no. "</td>\r\n"; // udskriv sub element navn echo "<td>". $navn. "</td>\r\n"; // udskriv sub element adresse echo "<td>". $adresse. "</td>\r\n"; echo "</tr>\r\n"; break; </table> XML writer XML writer muliggør at man skriver et XML dokument uden at have hele dokumentet i memory og er derfor velgnet til at generere meget store XML filer med. Eksempel på at oprette et nyt XML dokument (og returnere XML fremfor HTML). createwriter.php header("content-type: text/xml"); // opret writer $wrt = new XMLWriter(); // skriv direkte til output $wrt->openuri('php://output'); // skriv XML $wrt->startdocument();

$wrt->startelement('all'); $wrt->startelement('one'); $wrt->text('a'); $wrt->endelement(); $wrt->startelement('one'); $wrt->text('bb'); $wrt->endelement(); $wrt->startelement('one'); $wrt->text('ccc'); $wrt->endelement(); $wrt->endelement(); $wrt->enddocument(); XSL XSLT er en måde at transformere XML på. Det kan laves client side. Men det kan også laves server side. Laver man det server side, så kan man outputte HTML udfra XML uden at kode presentationen i PHP. Eksempel. showxsl.php <title>xsl demo</title> $xml = new DOMDocument(); // indlæs XML fil i DOM træ $xml->load('test.xml'); $xsl = new DOMDocument(); // indlæs XSL fil i DOM træ $xsl->load("test.xsl"); // opret XSLT processor og bed den bruge XSL $t = new XSLTProcessor(); $t->importstylesheet($xsl); // udskriv XML transformeret til HTML echo $t->transformtoxml($xml); </table>

test.xsl <?xml version="1.0" <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output method='html'/> <xsl:template match="/"> <table border="1"> <tr> <th>no</th> <th>navn</th> <th>adresse</th> </tr> <xsl:apply-templates/> </table> </xsl:template> <xsl:template match="medlemmer"> <xsl:apply-templates/> </xsl:template> <xsl:template match="medlem"> <tr> <td><xsl:value-of select="@no"/></td> <td><xsl:value-of select="navn"/></td> <td><xsl:value-of select="adresse"/></td> </tr> </xsl:template> </xsl:stylesheet> XSLT er en særdels kraftfuld teknologi. Men vær også opmærksom på, at det er et helt nyt sprog som man skal sætte sig ind i. Og det er et svært sprog - sværere end PHP! Anbefaling Efter at have set 5 forskellige XML extensions i brug, så er det jo naturligt at spørge om, hvilken man skal vælge. Min anbefaling er: modificere eksisternde XML => DOM oprette nyt XML => XML writer konvertere XML til andet XML format => XSLT læse XML med namespaces => DOM læse store XML filer => XML reader læse XML generelt => simple XML Altså simple XML i de fleste tilfælde!

Kommentar af jensgram d. 29. Dec 2008 1 Jaja, ok :) Fint som referenceværktøj og til det indledende overblik (og mere gør artiklen vel egentlig heller ikke krav på at være). Kommentar af jakobdo d. 07. Jan 2009 2 God artikel Arne_v, vil bestemt blive brugt som opslag i fremtiden, da jeg "godt" kan anvende XML, men støder dog tit ind i problemet: Hvordan er det nu man gør??? :o) Kommentar af kodak d. 19. Jan 2009 3 Jeg kan ikke få den til at skrive ÆØÅ æøå