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

VB.NET Discussion :

problème de format XML après modification en VB.Net


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2019
    Messages : 4
    Par défaut problème de format XML après modification en VB.Net
    Bonjour à tous,

    je suis plutôt débutant en vb.net et voici mon problème :
    mon programme est une interface entre 2 programmes. Le but est de modifier la valeur de certains nœuds qui ne correspondent pas à la valeur attendue dans le logiciel de destination.
    je modifie la valeur des nœuds dans un fichier type XML. La modification se fait bien pas de problème mais,
    le format de sortie est très différent de celui d'origine et du coup ça ne passe pas dans le logiciel de destination



    voici mon format XML original (en partie il fait près de 15000 lignes) :

    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
     
    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <p:Aller xmlns:p="http://www.xx.net" xmlns:acta="http://www.xx.net" xmlns:buda="http://www.xxx.net" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="ID0000000000">
    <DepenseAller>
    <Bordereau>
    <Piece>
    <BlocPiece>
    <InfoPce>
       <IdPce V="1006"></IdPce>
       <TypPce V="01"></TypPce>
       <NatPce V="09"></NatPce>
       <Obj V="CP.CHATEAU"></Obj>
    </InfoPce>
    </BlocPiece>
    </Piece>
    </Bordereau>
    </DepenseAller>
    <Fichier MIMEType="application/pdf">H4sIAAAAAAAAAHS3Y5AmTdA2eo9t27Zt27Zt27Zndmzt2LZ2bNs7tmfOPu/3fj/OiTjZVZVXXlGZ
    3Z1ZHZFNpigqTsdEzwZNdvf28gxNxkLPCs1OyEjoYGwNzcvLIGzl6qJo5iziYOfoYG9m70rIySDi
    (... environ 2000 lignes de ce type entre les 2 nodes <fichier></fichier>...)
    YOvgrOJoZGLGIGrmbmViJuFs5MUgbmXraubMIK2oKWpm4mBqxiBpZmVh6UrIwsbEySBrZm/haknI
    </Fichier>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signature">
    	<ds:SignedInfo>
    		<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
    		<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
    	</ds:SignedInfo>
    </ds:Signature></p:Aller>

    voici le format que j’obtiens en sortie :

    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
     
    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <p:Aller xmlns:p="http://www.xx.net" xmlns:acta="http://www.xx.net" xmlns:buda="http://www.xxx.net" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="ID0000000000">
      <DepenseAller>
        <Bordereau>
          <Piece>
            <BlocPiece>
              <InfoPce>
                <IdPce V="1006">
                </IdPce>
                <TypPce V="11">
                </TypPce>
                <NatPce V="11">
                </NatPce>
                <Obj V="CP.CHATEAU">
                </Obj>
              </InfoPce>
            </BlocPiece>
          </Piece>
        </Bordereau>
      </DepenseAller>
            <Fichier MIMEType="application/pdf">H4sIAAAAAAAAAHS3Y5AmTdA2eo9t27Zt27Zt27Zndmzt2LZ2bNs7tmfOPu/3fj/OiTjZVZVXXlGZ
    3Z1ZHZFNpigqTsdEzwZNdvf28gxNxkLPCs1OyEjoYGwNzcvLIGzl6qJo5iziYOfoYG9m70rIySDi
    (... environ 2000 lignes de ce type entre les 2 nodes <fichier></fichier>...)
    YOvgrOJoZGLGIGrmbmViJuFs5MUgbmXraubMIK2oKWpm4mBqxiBpZmVh6UrIwsbEySBrZm/haknI
    </Fichier>
      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signature">
        <ds:SignedInfo>
          <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        </ds:SignedInfo>
       </ds:Signature>
     </p:Aller>

    et voici mon code VB :

    Code : 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
     
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            Dim resource As String = "C:\temp\64300.xml"
            Dim resource2 As String = "C:\temp\64300-2.xml"
            Dim textdest As String = "11"
            Dim textsource As String = "11"
            Dim xDoc As New XmlDocument
     
            xDoc.Load(resource)
            Dim NatPce As XmlNodeList = xDoc.GetElementsByTagName("NatPce")
            Dim TypPce As XmlNodeList = xDoc.GetElementsByTagName("TypPce")
            For Each node As XmlNode In NatPce
                node.Attributes("V").Value = textdest
            Next node
            For Each node As XmlNode In TypPce
                node.Attributes("V").Value = textsource
            Next node
     xDoc.Save(resource2)
        End Sub
    à l'enregistrement il me met des CRLF entre le début et la fin de tout les noeuds ne possédant pas de valeur, il rajoutes des espace au début des nœuds et en fin de fichier (partie signature) il remplace les tabulation par des espaces
    j'ai essayé au début en traitant comme du texte (comme je faisais souvent en VBS), mais ça plantais (probablement du fait de la taille du fichier).
    j'ai donc trouvé cette solution, mais le format de sortie n'est pas bon...
    je cherche depuis plusieurs jour un moyen de modifier les valeurs des nœuds de ce type de fichier XML sans changer le format, mais je n'y arrive pas

    si quelqu'un à une idée je suis preneur

    Merci d'avance
    Olivier

  2. #2
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2019
    Messages : 4
    Par défaut
    Bonjour,
    Bon je suis finalement repartis sur une modification en mode texte. en Fait elle plantait a cause de caractère spéciaux et de l'encodage
    Donc je suis partis sur une autre méthode. Je lis le fichier avec un encodage UTF7 et en parallèle je charge le fichier en écriture avec un encodage différent
    je fait une boucle dans le fichier en lecture ligne par ligne puis je modifie la ligne dans le document en écriture (ça évite qu'il lise un caractère foireux et me crée une exception)
    bon l'inconvénient c'est que dans les nodes <Fichier MIMEType="application/pdf"> j'ai des lignes qui sautes mais comme je n'ai rien a modifier après ces nodes ça m'est égal

    pour ceux que ça intéresse voici le nouveau code (bon c'est probablement pas très propres et peut être moyen de l'améliorer, mais en attendant ça donne exactement ce que je voulais )
    j'ai bien sur essayé sans la partie lecture avec uniquement "If ligne.Contains("NatPce")" mais du fait des caractère spéciaux ça plantais avant la fin de la boucle

    Code : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
            Dim resource As String = "C:\temp\64300.xml"
            Dim resource2 As String = "C:\temp\64300-2.xml"
    'je vérifie si le fichier existe 
            If System.IO.File.Exists(resource) Then
                Try
                    Dim fileReader As System.IO.StreamReader
     
    'je lis le fichier en lecture encodage UTF7
                    fileReader = My.Computer.FileSystem.OpenTextFileReader(resource, System.Text.Encoding.UTF7)
     
                    Dim i As Integer = -1
                    Dim i2 As Integer = 0
                    Dim stringReader As String
    'Je lis le fichier en écriture avec un encodage qui lui plait bien (lol j'ai eu du mal a le trouver cet encodage) 
                    Dim lines As List(Of String) = File.ReadLines(resource, System.Text.Encoding.GetEncoding(0)).ToList()
    'je fait une lecture ligne par ligne 
                    Do Until fileReader.EndOfStream
     
    'je génère un numéro de ligne 
                        i = i + 1
                        stringReader = fileReader.ReadLine()
     
    'si la ligne contient le node recherché je la remplace par la valeur qui va bien 
                        If stringReader.Contains("NatPce") Then
                            i2 = i
                            MsgBox("trouvé : " & lines(i) & "ligne = " & i2)
    'quand même une petite vérif que la ligne que je modifie et la bonne 
                            Dim ligne As String = lines(i)
                            If ligne.Contains("NatPce") Then
    'je remplace la ligne par son numéro de ligne avec ma valeur 
                                lines(i2) = "   <NatPce V=""11""></NatPce>"
                           Else
                                MsgBox("Erreur la ligne n'est pas la bonne")
                            End If
                        ElseIf stringReader.Contains("TypPce") Then
                            i2 = i
                            Dim ligne As String = lines(i)
                            If ligne.Contains("TypPce") Then
                                lines(i2) = "   <TypPce V=""11""></TypPce>"
                            Else
                                MsgBox("Erreur la ligne n'est pas la bonne")
                            End If
                        End If
                    Loop 'Until stringReader Is Nothing
    'j'écris mon nouveau fichier 
                    File.WriteAllLines(resource2, lines, System.Text.Encoding.GetEncoding(0))
    'je ferme la lecture 
                    fileReader.Close()
                Catch ex As Exception
                    MsgBox("ERREUR DANS LA LECTURE DU FICHIER !!!!")
                End Try
            Else
                MsgBox("ERREUR LE FICHIER N’EXISTE PAS !!!!")
            End If
        End Sub
    voila j'ai comparé avec Winmerge et notepad++ c'est nickel partout : point, espacement, tabulation CRLF etc.

    bonne journée

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2019
    Messages : 4
    Par défaut
    Bonjour,

    bon comme mon code me plaisait pas, j'ai fouillé un peu et essayé pas mal de truc et quand on cherche on trouve

    voici mon code final (plus simple et aussi efficace)
    Code : 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
    36
     
    Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    'fichiers source et destination (mis ici dans une variable car je récupère leur nom ailleurs dans le programme complet)
            Dim resource As String = "C:\temp\64300.xml"
            Dim resource2 As String = "C:\temp\64300-2.xml"
    'vérification de la présence du fichier source
            If System.IO.File.Exists(resource) Then
                Try
    'définition du compteur i qui va être le numéro de ligne pour comparer et modifier
                    Dim i As Integer = -1
    'chargement du fichier source dans une liste avec un encodage spécifique 
                    Dim lines As List(Of String) = File.ReadLines(resource, System.Text.Encoding.GetEncoding(0)).ToList()
    'Parcourt de la liste 
                    For i1 As Integer = 0 To lines.Count - 1
    'j'incrémente le nombre de ligne 
                        i = i + 1
    'je vérifie si la ligne contiens le node à modifier
                        If lines(i).Contains("TypPce") Then
    'si c'est le cas je change le contenu de la ligne qu'il vient de trouver et donc portant le numéro de ligne i 
                            lines(i) = "   <TypPce V=""11""></TypPce>"
                        End If
                        If lines(i).Contains("NatPce") Then
                            lines(i) = "   <NatPce V=""11""></NatPce>"
                        End If
                    Next
    'la recherche est terminée j'écrit mon nouveau fichier 
                    File.WriteAllLines(resource2, lines, System.Text.Encoding.GetEncoding(0))
                    MessageBox.Show("Traitement Terminé ", "FIN DU TRAITEMENT", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Catch ex As Exception
                    MsgBox("ERREUR DE LECTURE DU FICHIER  !!!!")
                End Try
            Else
                MsgBox("ERREUR LE FICHIER  N'EXITE PAS !!!!")
            End If
            Me.Close()
        End Sub
    voilà plus qu'as mettre le sujet résolut

  4. #4
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bien joué

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2019
    Messages : 4
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    Bien joué
    Merci

    a oui pour ceux qui veulent utiliser mon code :
    ne pas oublier d'importer l'espace de nom system.io avant public Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Imports System.IO
    Public Class
    et pour mon 1er code de traitement en XML qui ne convenait pas pour mon application (mais peut servir autrement) il faut par contre l'espace de nom system.Xml
    bonnes journée

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

Discussions similaires

  1. Problème avec format de xml particulier au niveau des valeurs
    Par Evangeline dans le forum Bases de données
    Réponses: 10
    Dernier message: 21/08/2012, 13h44
  2. lecture xml : problème de format
    Par bebert3 dans le forum Flex
    Réponses: 1
    Dernier message: 11/03/2010, 14h09
  3. [débutant] [lomboz] Problème deploy.web.xml
    Par cdrikou dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 29/04/2004, 10h47
  4. [CR8] Problème de Format d'affichage
    Par khabch dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 19/02/2004, 14h10
  5. Problème de Format de date
    Par titititi007 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/06/2003, 08h19

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