8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je souhaiterai connaitre le valeur d'une entité interne (ie déclaration contenue dans le doctype), à savoir par exemple :

<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
<?xml-stylesheet type="text/xsl" href="xhtml.xsl"?>
<!DOCTYPE root SYSTEM "djaps.dtd" [
<!ENTITY wifi "<abbr xml:lang='en' title='ADSL via Wireless Fidelity'>WiFi</abbr>">
]>
<root>...</root> <!-- ce document n'est pas vide [cligne] -->


Sur un forum ami, une personne m'a conseillé de parser avec XMLReader (ce que j'ai fait), mais ce parser n'a pas l'air de vouloir prendre en compte mon noeud <!DOCTYPE> (si on peut appeler cela un noeud)

function findentity() {
	$xml = new XMLReader();
	$xml->open('code_ci_dessus.xml');
	$xml->setParserProperty(3,true); #valide le document [cligne]
	$n=0;
	while($xml->read()) {
		if ( $n++<10 ) {
			echo $xml->nodeType." ";
		}
		if ( $xml->nodeType == 6 ) { # 6 pour déclaration entités
			echo "name : ".$xml->name;
			echo " / value : ".$xml->value;
		}
	}
	$xml->close();
}
findentity();

me retourne : 7 10 1 14 1 14 1 14 1 3 (le document est valide !)
- 7 correspond à <?xml-stylesheet type="text/xsl" href="xhtml.xsl"?>
- 10 correspond à <root> (la racine de mon document
Je n'ai pas de type 6 (XMLReader::ENTITY) Smiley bawling

Comment (une autre méthode, peut-être) récupérer cet entité...

Merci par avance
Modifié par djaps (29 Nov 2009 - 12:03)
Bonjour,

Simplexml ne prend pas en compte les déclarations xml ... merci quand même pour ta réponse

Sinon, ayé, j'ai trouvé Smiley lol
Je vous donne le fruit de mes recherches (personnelles car les tutos sur cette question manquent affreusement)
Dans le DOM de php5+, nous avons La classe DOMDocumentType
http://www.php.net/manual/fr/class.domdocumenttype.php
Problème, comment créer (instancier) cette classe et utiliser ses objets (ce que je cherche, en fait...)
Voici la soultion

$xml->load('fichier.xml');
$xml = $xml->doctype; // crée cette classe DOMDocumentType
var_dump (htmlentities($xml->internalSubset, ENT_NOQUOTES));

qui me retourne ce que je veux (enfin, pas vraiment), à savoir l'intitulé entier de mon DOCTYPE
a écrit :

<!DOCTYPE root SYSTEM "djaps.dtd" [
<!ENTITY wifi "<abbr xml:lang='en' title='ADSL via Wireless Fidelity'>WiFi</abbr>">
]>



Pour aller plus loin, en théorie, je doit pouvoir récupérer directement mes entités avec

$xml->entities->item(0)

qui me donne un DOMEntity, mais comment récupérer mes différentes entités ( nom: valeur )
http://www.php.net/manual/fr/class.domentity.php

Voilà
David