1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2005
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2005
    Messages : 113
    Points : 32
    Points
    32

    Par défaut Xpath et modification attribut

    Bonjour,

    J'aimerais savoir comment faire pour lister des nœuds en particulier dans un fichier XML et modifier la valeur d'un attribut des ces nœuds.
    Pour être plus précis, dans le fichier XML d'exemple ci-dessous, j'aimerais pouvoir sélectionner tous les nœuds filter dont le type est "PersistedFilter" et modifier la valeur de leur attribut oid


    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <filters>
    		<filter type="PersistedFilter" category="1" path="Ship Filters\Drawing\Object Filters\Object Types\Grid Systems\GridPlane Strong Frame" oid="{0000272E-0000-0000-3600-8C0CAC584004}">
    			<askFilter/>
    		</filter>
    		<filter type="FlyingFilter" category="1" path="Ship Filters\Drawing\Object Filters\Object Types\Grid Systems\GridPlane Strong Frame" oid="{0000272E-0000-0000-3600-8C0CAC584004}">
    			<askFilter/>
    		</filter>
    		<filter type="PersistedFilter" category="1" path="Ship Filters\Drawing\Object Filters\Object Types\Grid Systems\GridPlane Strong Frame" oid="">
    			<askFilter/>
    		</filter>
    		<filter type="PersistedFilter" category="1" path="Ship Filters\Drawing\Object Filters\Object Types\Grid Systems" oid="{0000272E-0000-0000-3600-8C0CAC584005}">
    			<askFilter/>
    		</filter>		
    </filters>
    J'ai un bout de code qui me permet bien de lister les nœuds du fichier XML qui m'intéressent, mais je ne sais pas comment modifier la valeur de l'attribut oid.

    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
     
        Private Sub BtnTestXML_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnTestXML.Click
            Dim xpathDoc As XPathDocument
            Dim xmlNav As XPathNavigator
            Dim ExpXPath As String
            Dim Nodes As XPathNodeIterator
            Dim oid As String
            Dim path As String
     
            Try
                xpathDoc = New XPathDocument("C:\test.xml")
     
                xmlNav = xpathDoc.CreateNavigator()
     
                'On crée ici l'expression XPath de recherche des filtres 
                ExpXPath = "//filter[@type='PersistedFilter' and @oid != '']"
                'On lance la recherche 
                Nodes = xmlNav.Select(xmlNav.Compile(ExpXPath))
                ' On vérifie si la recherche a été fructueuse
                While (Nodes.MoveNext())
                    path = Nodes.Current.GetAttribute("path", "")
                    oid = Nodes.Current.GetAttribute("oid", "")
                    AfficherTrace("path = " & path & "; oid = " & oid)
                End While
     
     
            Catch ex As XPathException
                System.Console.WriteLine("XMLException: " + ex.Message)
            Catch ex As Exception
                System.Console.WriteLine("Exception: " + ex.Message)
            End Try
     
        End Sub

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    avril 2013
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2013
    Messages : 260
    Points : 0
    Points
    0

    Par défaut

    Bonsoir,

    Pourquoi vous utiliser pas listview pour modifier la valeur dans oid? voici une solution qui marche pour afficher dans listview1.
    voici en image :
    Nom : Sans titre.jpg
Affichages : 17
Taille : 65,7 Ko
    voici le code :
    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
     Dim filePatch As String = Nothing
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim open As New OpenFileDialog
            open.Filter = "Fichier XML (*.xml)|*.xml"
            If open.ShowDialog = Windows.Forms.DialogResult.OK Then
                filePatch = open.FileName
                Dim doc As XDocument = XDocument.Load(filePatch)
                For Each dm In doc.Descendants("filter")
                    Dim path As String = dm.Attribute("path").Value
                    Dim code As String = dm.Attribute("oid").Value
                    Dim lvi As New ListViewItem(path)
                    lvi.SubItems.Add(code)
                    ListView1.Items.Add(lvi)
                Next
            Else
                Exit Sub
            End If
        End Sub
     Private Sub ListView1_DoubleClick(sender As System.Object, e As System.EventArgs) Handles ListView1.DoubleClick
            For Each item As ListViewItem In ListView1.SelectedItems
                TextBox1.Text = item.SubItems(1).Text
            Next
        End Sub
     
        Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
            For Each item As ListViewItem In ListView1.SelectedItems
                item.SubItems(1).Text = TextBox1.Text
            Next
        End Sub
    il faut que je regarde pour sauvegarder avec listview.
    cordialement,

  3. #3
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 013
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 013
    Points : 1 755
    Points
    1 755

    Par défaut

    D'abord,
    ExpXPath = "//filter[@type='PersistedFilter' and @oid != '']"
    l'expression n'est pas mal; seulement, je dirais, si avec @oid != '' vous voulez dire qu'il existe un attribut oid, on peut faire simplement, on dirait même plus correctement, comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExpXPath = "//filter[@type='PersistedFilter' and @oid]"
    j'aimerais pouvoir sélectionner tous les nœuds filter dont le type est "PersistedFilter" et modifier la valeur de leur attribut oid
    Pour modifier, ça veut dire setAttribute() en dom pour null/vide namespace.
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nodes.Current.setAttribute("oid", "abc")

Discussions similaires

  1. [XPath] accès aux attributs capricieux
    Par christel1982 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/11/2006, 19h54
  2. Modification attributs d'un fichier avec PHP
    Par zetta dans le forum Fichiers
    Réponses: 1
    Dernier message: 03/07/2006, 11h55
  3. [XPath] test self::attribute
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 16
    Dernier message: 16/06/2006, 12h03
  4. [Xpath] Selection d'attributs sur critère
    Par lolo_ici_et_la dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 22/03/2006, 22h04
  5. [XSL][XPATH] recopier les attributs d un élément mais pas le
    Par Triangle dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/08/2005, 16h07

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