IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Supprimer les espaces de noms dans XML


Sujet :

Langage PHP

  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 461
    Points : 43 264
    Points
    43 264
    Par défaut Supprimer les espaces de noms dans XML
    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

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 861
    Points : 6 565
    Points
    6 565
    Par défaut
    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?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <montag ns1:attr1="toto" ns2:attr1="titi"/>
    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?

    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

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 861
    Points : 6 565
    Points
    6 565
    Par défaut
    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

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 461
    Points : 43 264
    Points
    43 264
    Par défaut
    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

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 861
    Points : 6 565
    Points
    6 565
    Par défaut
    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

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 461
    Points : 43 264
    Points
    43 264
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer les espaces et virgules dans une chaîne de caractères
    Par jean jojo dans le forum Général Python
    Réponses: 4
    Dernier message: 27/02/2018, 11h20
  2. Supprimer les espaces dans un XML
    Par GreatDeveloperOnizuka dans le forum C#
    Réponses: 6
    Dernier message: 28/09/2010, 16h09
  3. Réponses: 4
    Dernier message: 27/11/2008, 02h03
  4. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  5. Supprimer les espaces des noms de fichier
    Par Cathy dans le forum Linux
    Réponses: 20
    Dernier message: 04/08/2005, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo