Bonsoir,
En vue de simplification d'un XML, je cherche à supprimer tous les espaces de noms dans un XML, mais en gardant le contenu. Est-ce faisable ?
Bonsoir,
En vue de simplification d'un XML, je cherche à supprimer tous les espaces de noms dans un XML, mais en gardant le contenu. Est-ce faisable ?
Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
Mon article sur le P2V, mon article sur le cloud
Consultez nos FAQ : Windows, Linux, Virtualisation
Oui bien sûr, mais attention, éliminer les namespaces c'est d'abord perdre une partie du sens du document, et ça peut conduire à des situations singulières.
Par exemple, que faire dans ce cas?:Je sacrifie un des deux attributs ou bien je les agglomère (sachant qu'ils n'ont peut être pas du tout le même sens)? Une autre solution possible serait de renommer les attributs en ns1_attr1 et ns2_attr1, mais à ce moment là, est-ce que ça vaut encore la peine de supprimer les namespaces?
Code : Sélectionner tout - Visualiser dans une fenêtre à part <montag ns1:attr1="toto" ns2:attr1="titi"/>
Est-ce que le ou les documents XML que tu veux transformer peuvent avoir ce cas de figure et si oui de quelle manière souhaites-tu le gérer?
Brachygobius xanthozonus
Ctenobrycon Gymnocorymbus
Sinon, avec une transformation XSL:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
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$xslt = <<<'EOT' <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes" method="xml" version="1.0" encoding="utf-8" /> <xsl:strip-space elements="*"/> <xsl:template match="comment()|processing-instruction()"> <xsl:copy /> </xsl:template> <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:for-each select="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="." /> </xsl:attribute> </xsl:for-each> <xsl:apply-templates /> </xsl:element> </xsl:template> </xsl:stylesheet> EOT; $XMLFileURL = 'toto.xml'; $xsl = new DOMDocument; $xsl->loadXML($xslt); $xml = new DOMDocument; $xml->load($XMLFileURL); $proc = new XSLTProcessor; $proc->importStyleSheet($xsl); echo $proc->transformToXML($xml);
(Au besoin, installer la bibliothèque xsl: sudo apt-get install php7.4-xsl).
Brachygobius xanthozonus
Ctenobrycon Gymnocorymbus
Merci pour le retour.
Pas de risque de collision, les espaces de noms surchargent donc inutilement le doc pour moi.
J'avais vu la transformation xsl, qui même si je le la maitrse pas pourrait me servir de boite noire, mais je ne peux pas forcément installler la lib xsl.
Je présume qu'il n'y a pas de fonction toute faite pour supprimer ces espaces de noms.
Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
Mon article sur le P2V, mon article sur le cloud
Consultez nos FAQ : Windows, Linux, Virtualisation
Non hélas, il n'y a pas de fonction toute faite. Si tu ne peux pas installer php-xsl, peut être dispose tu déjà sur ton système d'un autre processeur XSLT que tu pourrais invoquer par le shell? (par exemple xsltproc).
Sinon, une autre solution serait de créer une fonction qui passe en revue tout le document en se basant sur XMLReader (qui doit être activée par défaut) et qui recompose le document en éliminant les namespaces au fur et à mesure. On peut éventuellement la combiner avec XMLWriter.
Il est possible de le faire avec DOMDocument, mais je pense que c'est la manière la moins adaptée.
Quoi qu'il en soit, avec l'une ou l'autre de ces deux dernières solutions on rentre dans le fastidieux et aujourd'hui je ne pourrai pas me pencher dessus.
Brachygobius xanthozonus
Ctenobrycon Gymnocorymbus
Problème réglé.
J'ai viré les espaces de noms à base de str_replace depuis le contenu du xml en mode chaine de caractères.
Je fais une boucle extrayant les espaces de noms qui se présentent sous la forme xmlns:nom="url de l'espace de nom"Je supprime cette sous-chaine via str_replace (sous-chaine,""), je retire l'url et le préfixe xmlns: de la sous-chaine et m'en sers pour faire un str_replace($nom.":","").
Peut-être pas ce qu'il y a de plus clean, mais fonctionnel pour mon cas.
Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
Mon article sur le P2V, mon article sur le cloud
Consultez nos FAQ : Windows, Linux, Virtualisation
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager