Récupérer la déclaration de tous NS (xmlns:prefix)
Bonjour,
Contexte: Parseur, DOM / PHP (5.2)
Demande: Trouver toutes déclarations NS
Après chargement et traitement d'un DOM je veux l'afficher via un parseur
personnel mais je perds, alors, les déclarations des NS situés en seconde
position (sur le même tag). J'ai bien cherché partout mais pas de réponses
adéquates à la résolution du problème. Le DOM est bien valide, tous
les préfix/uri existent mais impossible de caler la déclaration du NS à l'endoit
ou elle était à l'origine. Autrement dit la sortie devient invalide.
Fonctions testées:
- getElementsByTagNameNS
- getAttributeNode
- getAttributeNS
- getElementsByTagNameNS
Entrée dans le DOMDocument:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
<body>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" h="azerty"/>
<ex:test xmlns:ex="http://www.w3.org/2001/XMLExemple" attr="exemple">
<ex:t>
<ex:h1>
*** text ***
</ex:h1>
</ex:t>
</ex:test>
<ouv:livre xmlns:ouv='urn:loc.gov:livres' xmlns:isbn='urn:ISBN:0-395-36341-6'>
<isbn:k alpha="1"/>
</ouv:livre>
</body> |
Sortie parseur:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
<body>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" h="azerty"/>
<ex:test xmlns:ex="http://www.w3.org/2001/XMLExemple" attr="exemple">
<ex:t>
<ex:h1>
*** text ***
</ex:h1>
</ex:t>
</ex:test>
<ouv:livre xmlns:ouv="urn:loc.gov:livres">
<isbn:k alpha="1"/>
</ouv:livre>
</body> |
Inutile de dire que le script est un simple exemple, merci... et merci
aussi pour vos idées et solutions proposées.
J'ai, dans un premier temps j'ai résolu à placer la récupération des DECL dans
le node XML_DODUMENT_NODE mais j'ai abandonné l'idée. Un array qui se balade dans une class (même privat) c'est pas élégant, d'où ma demande.
Ma fonction primaire:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
$allAttrNS = $this -> _domToParse -> getElementsByTagNameNS("*", "*");
if (is_object($allAttrNS))
{
for($i=0; $i<$allAttrNS->length; $i++)
{
$prefix = $allAttrNS -> item($i) -> prefix;
$uri = $allAttrNS -> item($i) -> namespaceURI;
if (!array_key_exists($prefix, $this -> _arrayNS) && !is_null($prefix) && $prefix != "")
{
$this -> _arrayNS[$prefix] = $allAttrNS -> item($i) -> namespaceURI;
}
}
print_r($this -> _arrayNS);
} |
Ce qui donne lors de l'affichage du tableau:
Puis, traité par chaque noeud j'obtiens bien le placement des attributs NS mais comme vous le constaté c'est pas très propre... Et bien trop lourd.
Ce que je souhaite, donc, c'est faire la même chose mais, directement, sur le Node Element. (XML_DOM_ELEMENT). Si quelqu'un a un idée, merci du partage.
Désolé si c'est encore un peu confus :-)