Namespaces et DomDocument::importNode

Répondre
LupusMic
le 04/09/2006 à 20:08
LupusMic
Bonjour,

J'ai un petit problème cosmétique. Voici, simplifié, la problématique :

Le document XML à importer :
adv.xml
<?xml version='1.0' encoding='utf-8' ?>
<!DOCTYPE adventures SYSTEM "adventures.dtd">
<adventures xmlns="adventures.dtd"
xmlns:html="http://www.w3.org/1999/xhtml">
<adventure id='adv-adoprixtoxis' kind='kind-sf'>
<title>Adoprixtoxis</title>
<synopsis>
<html:p>Une aventure spatiale !</html:p>
<html:p>Qui n'est pas terminée.</html:p>
</synopsis>
<opinion>
<html:p>Très bonne !</html:p>
<html:p>Mais faudrait en dire plus ;)</html:p>
</opinion>
</adventure>
</adventures>


La DTD qui dit comment qu'il doit être, mon XML :
adv.dtd
<!ELEMENT adventures (adventure)+ >
<!ELEMENT adventure (title,synopsis,opinion) >
<!ATTLIST adventure id ID #IMPLIED >
<!ATTLIST adventure title CDATA #IMPLIED >
<!ATTLIST adventure kind IDREF #IMPLIED >

<!ELEMENT title (#PCDATA) >
<!ELEMENT synopsis (#PCDATA)+ >
<!ELEMENT opinion (#PCDATA)+ >


Le script, en exécution locale, qui permet de générer la page d'index :
adv.php
<?php
$advsDoc = DomDocument::load('adventures.xml') ;
$advsListNode = $advsDoc->getElementsByTagName('adventure') ;
$templateDoc = DomDocument::load('idx-template.html') ;
$templateDoc->validate() ;
$contentNode = $templateDoc->getElementById('content') ;

$dlNode = $contentNode->ownerDocument->createElement('dl') ;
foreach($advsListNode as $advNode)
{
$filebase = $advNode->getAttribute('id') ;
$title = $advNode->getElementsByTagName('title')
->item(0)->nodeValue ;

$dtNode = $contentNode->ownerDocument->createElement('dt') ;
$ddNode = $contentNode->ownerDocument->createElement('dd') ;
$aNode = $contentNode->ownerDocument->createElement('a') ;

$aNode->nodeValue = "(&#8230;)" ;
$aNode->setAttribute('href', "$filebase.html") ;
$dtNode->nodeValue = "$title&#0010;:" ;
// $ddNode->nodeValue = "Premier p" ;

$pNode = $advNode->getElementsByTagName('synopsis')->item(0)
->getElementsByTagName('p')->item(0) ;
$pNode = $ddNode->ownerDocument->importNode($pNode, true) ;

$pNode->appendChild($aNode) ;
$ddNode->appendChild($pNode) ;
$dlNode->appendChild($dtNode) ;
$dlNode->appendChild($ddNode) ;

}
$contentNode->insertBefore($dlNode, $contentNode->lastChild) ;

$templateDoc->normalize() ;
$templateDoc->save("{$advsDir}index.html") ;
unset($templateDoc) ;
?>


Le template HTML de la page d'index :
adv.html
<?xml version="1.0" encoding="iso-8859-15"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
<head>
<title>Aventures MP3</title>
<link rel="stylesheet" type="text/css" href="../style.css" />
</head>
<body>
<div id="body">
<div id="content">
<h1>Aventures.</h1>
<div class="section">
<p>
Voici la liste alphabétique des aventures
netophoniques&#0010;:
</p>
</div>
</div>
</body>
</html>


Le résultat :
index.html
<?xml version="1.0" encoding="iso-8859-15"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr">
<head>
<title>Aventures MP3</title>
<link rel="stylesheet" type="text/css" href="../style.css" />
</head>
<body>
<div id="body">
<div id="content">
<h1>Aventures.</h1>
<div class="section">
<p>
Voici la liste alphabétique des aventures
netophoniques&#0010;:
</p>
<dl><dt>Adoprixtoxis
:</dt>
<dd xmlns:html="http://www.w3.org/1999/xhtml">
<p xmlns:html="http://www.w3.org/1999/xhtml">Une aventure spatiale !
<a href="adv-adoprixtoxis.html">(&#8230;)</a></p></dd></dl>
</div>
</div>
</body>
</html>


Comme vous le constaterez, malgréle namespace commun, libxml me rajoute des déclarations XML. Avez-vous déjà rencontré le problème et résolu la chose de manière élégante ?

(Désolé de ne pas utiliser le Wall, mais il n'est pas très adapté à mon problème ;))

Merci !
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 05/09/2006 à 02:18
LupusMic
Après une petit heure de recherche supplémentaire, il apparait que ce que je veux faire n'est possible qu'avec DOM 3 (createProcessingInstruction).

J'ai deux idées pour contourner : passer par une transformation XSLT bidon, mais ça doit pomper en mémoire. Ou alors traiter le document XML obtenu à coup de strreplace ;).

J'attends vos avis, et vais continuer sur autre chose en attendant.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Bzh
le 08/09/2006 à 21:35
Bzh
Là, dis donc, ça devient un niveau très interressant !

Ca change des postes abituels !!! Là, je peux difficilement t'aider...

Par contre, je suis pas de ton avis sur l'emploi des templates...

Je trouve que cela consomme trop de ressources pour ce que cela apporte au site...

Mais, je veux bien des arguments en faveur smiley !!!!
LupusMic
le 10/09/2006 à 11:05
LupusMic
Je trouve que cela consomme trop de ressources pour ce que cela apporte au site...


C'est une application CLI, voir GUI un jour ;).
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours