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

Scripts/Batch Discussion :

Accès xml avec namespaces [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Août 2022
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Accès xml avec namespaces
    Bonjour

    Je voudrais retrouver dans ce fichier, les éléments dont la balise est [ns4:ID] et modifier le fichier au niveau des balises [ns4:BirthDate].
    J'ai déjà fait cela sur des fichiers xml avec des balises simples, ici mon souci c'est que je ne parviens pas à le faire à cause du namespace précédant les balises :
    Code XML : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <ns2:invoice xmlns="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:8" xmlns:ns2="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:2" xmlns:ns3="urn:un:unece:uncefact:data:standard:QualifiedDataType:8" xmlns:ns4="urn:un:unece:uncefact:data:standard:PersonInformationEntity:1" versionID="1.2">
    	<ns2:CrossIndustryInvoice>
    		<ns2:CIIHExchangedDocumentContext>
    			<VersionID>1.2</VersionID>
    			<SpecifiedTransactionID>0202210648</SpecifiedTransactionID>
    		</ns2:CIIHExchangedDocumentContext>
    		<ns2:CIIHExchangedDocument>
    			<ID>0202210648-1</ID>
    			<TypeCode>380</TypeCode>
    			<IssueDateTime>2022-05-20T11:16:12Z</IssueDateTime>
    		</ns2:CIIHExchangedDocument>
    		<ns2:CIIHSupplyChainTradeTransaction>
    			<ApplicableCIIHSupplyChainTradeDelivery>
    				<ShipToCITradeParty>
    					<ns4:ID schemeID="token" schemeAgencyName="token">1001154</ns4:ID>
    					<ns4:Name>DURAND</ns4:Name>
    					<ns4:FirstName>DAVID</ns4:FirstName>
    					<ns4:LastName>ARNAULT</ns4:LastName>
    					<ns4:BirthDate>1910-09-10</ns4:BirthDate>
    					<ns4:PostalCITradeAddress>
    						<ns4:LineOne>ARNAULT MARC </ns4:LineOne>
    						<ns4:LineTwo>1 RUE GRANDE</ns4:LineTwo>
    						<ns4:PostcodeCode>92000</ns4:PostcodeCode>
    						<ns4:CityName>UNE VILLE</ns4:CityName>
    						<ns4:CountryID>FRANCE</ns4:CountryID>
    					</ns4:PostalCITradeAddress>
    					<ns4:ContextShipTo>
    						<ns4:GIR listID="ESPPADOM_GIR" listAgencyName="EDESS">3</ns4:GIR>
    					</ns4:ContextShipTo>
    				</ShipToCITradeParty>
    			</ApplicableCIIHSupplyChainTradeDelivery>
    		</ns2:CIIHSupplyChainTradeTransaction>
    	</ns2:CrossIndustryInvoice>
    </ns2:invoice>

    J'ai recherché des infos sur le net mais je ne m'en sors pas, merci d'avance pour votre aide.

  2. #2
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Bonjour,

    Un truc dans le style ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [xml]$xml = Get-Content '.\XML test\doc.xml'
    $namespace = @{e="urn:un:unece:uncefact:data:standard:PersonInformationEntity:1"}
    $ID = Select-Xml -Xml $xml -XPath "//e:ID" -Namespace $namespace
    $ID.Node
    
    Pour avoir toutes les valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [xml]$xml = Get-Content '.\doc.xml'
    $namespace = @{e="urn:un:unece:uncefact:data:standard:PersonInformationEntity:1"}
    $ID = Select-Xml -Xml $xml -XPath "//e:*" -Namespace $namespace
    $ID.Node
    

  3. #3
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Août 2022
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse rapide et efficace, troxsa, ça fonctionne super.
    Par contre, je me rends compte qu'il me faut pouvoir itérer sur l'élément ShipToCITradeParty et récupérer les valeurs des champs : ns4:ID et ns4:BirthDate.
    Cet élément peut se retrouver de nombreuses fois dans le fichier et Select-Xml ne permet pas de récupérer une collection d'objets.

  4. #4
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Je pense qu'il faut faire la meme chose mais avec NS2 et lire les childnodes pour récupérer ce que vous recherchez, je regarderais ce soir ou demain

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Code powershell : 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
    $content = Get-Content 'test.xml' -Raw
    $xml = [xml]$content
     
    $namespaces = @{
        ns = "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:8"
        ns2 = "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:2"
        ns3 = "urn:un:unece:uncefact:data:standard:QualifiedDataType:8"
        ns4 = "urn:un:unece:uncefact:data:standard:PersonInformationEntity:1"
    }
     
    $ships = Select-Xml -Xml $xml -XPath "//ns:ShipToCITradeParty" -Namespace $namespaces
    foreach($ship in $ships)
    {
        $ship.Node.ID.'#text'
        $ship.Node.BirthDate
    }

    ou

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $content = Get-Content 'test.xml' -Raw
    $xml = [xml]$content
     
    $nsmgr = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $xml.NameTable
    $nsmgr.AddNamespace("ns", "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:8")
    $nsmgr.AddNamespace("ns2", "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:2")
    $nsmgr.AddNamespace("ns3", "urn:un:unece:uncefact:data:standard:QualifiedDataType:8")
    $nsmgr.AddNamespace("ns4", "urn:un:unece:uncefact:data:standard:PersonInformationEntity:1")
     
    $ships = $xml.SelectNodes("//ns:ShipToCITradeParty", $nsmgr)
    foreach($ship in $ships)
    {
        $ship.SelectSingleNode("ns4:ID", $nsmgr).'#text'
        $ship.SelectSingleNode("ns4:BirthDate", $nsmgr).'#text'
    }

  6. #6
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Août 2022
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    Merci ericlm128 pour cette réponse détaillée, je vais étudier cela.

    Cdt

  7. #7
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2022
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Août 2022
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Encore grand merci à tous les 2 : ericlm128 et troxsa

    J'ai pu récupérer les valeurs qui me fallait, merci à vous, avec les espaces de noms je vous avoue que je ne voyais pas comment m'en sortir.

  8. #8
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Bonjour,

    Je me suis souvenu en VB.net (C#) on utilise Linq to XML qui est de meilleurs performance, l'avantage est : il se moque des Namespaces et cela est plus petit a écrire (special dev )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [System.Xml.XmlDocument]$xmldoc =  New-Object System.Xml.XmlDocument
    $xmldoc.Load("{PathToXML}\doc.xml")
    $xmlnode = $xmldoc.GetElementsByTagName("ShipToCITradeParty")
    
    Vous avez ici des exemples (en C# et vb.net mais facilement convertible en Powershell)
    https://www.dotnetcurry.com/linq/564...rials-examples

    J'avais un autre site sur le sujet avec des exemples très simple avec LINQ mais sur mon PC perso, (si je l'ai encore) je le communiquerai

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    @troxsa

    il se moque des Namespaces
    Tous les exemples de lecture d'un xml de l'article n'utilise pas de NameSpace.
    Les seules exemples sont le 9 et 10 d'écriture ou il spécifie un namespace.

    https://docs.microsoft.com/fr-fr/dot...e?view=net-6.0
    La méthode GetElementsByTagName accepte un deuxième arguments namespaceURI. Il ne semble pas complètement s'en moquer.

    GetElementsByTagName semble être une ancienne méthode dépréciée et conservée pour la compatibilité descendes de versions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Il est recommandé d’utiliser ou XmlNode.SelectNodes XmlNode.SelectSingleNode de méthode au lieu de la GetElementsByTagName méthode.

    Je ne suis pas réellement un spécialiste du XML, peut être ai je tord

  10. #10
    Membre actif
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    386
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Novembre 2004
    Messages : 386
    Points : 264
    Points
    264
    Par défaut
    Hello,

    Oui, tu as raison ...
    quand j'avais fait le test qu'avec [XML]$XML = Get-content ..... ça ne fonctionnait pas en utilisant XPATH, et en faisant des recherches de balise XML il ne trouvait pas "ShipToCITradeParty" avec le Namespace ça fonctionnait mieux (avec le code que tu as donnés), c'est pour ça que j'ai ajouté "il se moque du Namespace" car ça fonctionne sans.
    ça fait bien longtemps que je n'ai plus utiliser C# ou Vb.net je suis resté a l'ancienne méthode des année 2002/2005 (GetElementsByTagName), après la fonctionnalité est toujours présente

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

Discussions similaires

  1. [Inno Setup] XML avec NameSpaces
    Par peekabouh dans le forum Outils
    Réponses: 1
    Dernier message: 02/06/2017, 16h29
  2. Extraction de données avec XSL sur des XML avec namespace
    Par snake264 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/02/2012, 10h16
  3. [JDOM] Génération d'un XML avec Namespace (bug?)
    Par tapadami dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 03/08/2011, 18h56
  4. Problème parcours d'un fichier XML avec namespace
    Par ramroum1986 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 20/05/2010, 21h55
  5. Parcourir un XML avec namespace
    Par ujoodha dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 20/04/2006, 09h21

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