[DOM] XML Dom et déclaration de NS inconnus
Salut les gens,
Apache : Apache 2.0
PHP : Version 5.2.6
Sur un projet j'utilise la class DOM et parmi l'une des applications se trouve un parser mais la déclaration des namespaces me posent un soucis.
Malgré diverses recherches je ne trouve pas réponse à ce problème.
Existe t-il une fonction équivalente à celle se trouvant dans simpleXML qui est getDocNamespaces?
Au pire, si ce n'est pas le cas, y a t'il une "astuce", un algo qui permetrait de la simuler avec DOM? A savoir, bien que j'ai intégré la fonction je trouve
ridicule "dans DOM" de devoir utiliser simpleXML... Ce me semble parfaitement idiot et illisible sachant que tout le script, lui, est écrit avec la class DOM.
En gros c'est inélégant pour ne pas dire "moche".
Mon besoin:
- Lecture de toutes déclarations et quelles soient ou non normalisée.
- Que ce soit réalisé avec DOM
- Ne pas utiliser $dom -> saveXML
Fonction dans laquelle cette fonction devra se trouver:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
/**
* Retourne la déclaration du ou des namespaces pour le noeud en cours
*
* @access : public
* @value : [string] Vide ou nom du namespace si besoin
* @return : string Chaine concaténée key/value ou vide
*/
public function getNamespaceDECL($mixedNamespace = "*")
{
/**
* Si l'argument est invalide on sort
*/
if (!is_string($mixedNamespace)) trigger_error(ErrorDisplayDom::ERR_ARG_STRING, E_USER_ERROR);
/**
* Si la variable de class n'est pas valable on sort
*
* NOTA : la variable _domNode est référencée dans la class
* NOTA : précision sans doute inutile mais bon...
*/
if (!$this -> _domNode instanceof DOMNode) trigger_error(ErrorDisplayDom::ERR_INS_UNVALID, E_USER_ERROR);
/**
* Récupération du noeud en cours
*
* @var instance
*/
$domNode = $this -> _domNode;
/**
* Chaine à retourner
*
* @var string
*/
$script = "";
/**
* Chaine des attributs résultants
*
* @var string
*/
$strAttr = "";
/**
* Création de l'oblet Simple XML
*
* @var string
*/
$simple = simpleXML_import_dom($domNode);
/**
* Si l'argument demande tous les namespace on poursuit
*/
if ($mixedNamespace == "*")
{
/**
* Tableau résultat
*
* @var array
*/
$arraySimpleXml = $simple -> getDocNamespaces(true);
/**
* Détruit l'objet Simple XML
*/
unset($simple);
/**
* Boucle sur les éléments du tableau en ne prenant que la clef
*/
while(list($strKey) = each($arraySimpleXml))
{
/**
* Si la clef est vide on la traite ainsi
*/
$strKey = "xmlns" . (($strKey == "") ? $strKey = "" : ":".$strKey);
/**
* Lance la fonction de récupération
*
* @var string
*/
$resAttr = $domNode -> getAttribute($strKey);
/**
* Si la chaine n'est pas vide on assigne sa valeur
*/
if ($resAttr != "") $strAttr .= " ".$strKey."=\"".$resAttr."\"";
}
}
/**
* Au contraire l'appel se fait sur un nommé
*/
else
{
/**
* Prépare de la déclaration
*/
$strNamespace = "xmlns:".$mixedNamespace;
/**
* Lance la fonction de récupération
*
* @var string
*/
$resAttr = $domNode -> getAttribute($strNamespace);
/**
* Si la chaine n'est pas vide on assigne sa valeur
*/
if ($resAttr != "") $strAttr .= " ".$$strNamespace."=\"".$resAttr."\"";
}
/**
* Assignation des valeurs
*/
$script = $strAttr;
/**
* Retourne la chaine formée
*/
return $script;
} |
Voici à partir d'un exemple bourré de Decl NS ce que j'obtiens: (il va de soit que ce n'est qu'un exemple bidon que je ne saurais, bien entendu, utiliser en production)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.global.com" xmlns:tpl="http://www.tpl.com" lang="fr" xml:lang="fr">
<head tpl:id="TOTO" id="primaire">
<tpl:title alpha="one">
The_title
</tpl:title>
<meta name="description" content="tree sur xml" />
</head>
<body xmlns="http://www.global.com" mlns:oups="http://www.oups.com">
<div>
<![CDATA[Un message accentu&eactue; avec un e accent aïgu (é).]]>
</div>
<?php $exemple = "Azerty"; echo $exemple; ?>
<div>
<p>
<hr xmlns="http://www.last.fr" xmlns:tst="http://www.last.fr" />
un paraph
<span xmlns:bis="http://www.bis.fr">un span</span>
</p>
</div>
<span><a href="www.com.com">Bonjo<br />ur...!</a></span>
<tpl:exemple tpl:ATTR="Bidule" />
<span><span><span>Au revoir...!</span></span></span>
</body>
</html> |
Comme constaté la fonction marche mais, même répondant à la problématique des déclarations des NS, la manière dont elle y répond ne me
satisfait pas. Y a t'il quelqu'un qui saurait m'aiguiller sur une autre façon de faire... plus élégante?
J'ai tenté d'être clair et le plus complet qui soit dans ma demande si vous souhaitez plus d'information n'hésitez pas je répondrais autant que possible.
Merci, si ce n'est pour une réponse en tout cas pour avoir eu la patience de tout lire ;)
@+ les gens ;)