XML et attribut [Résolu]

Signaler
Messages postés
234
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012
-
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Bonsoir,
J'essai de lire un fichier XML du type :
<?xml version= "1.0" encoding="UTF-8" standalone= "yes"?>
http://schemas.microsoft.com/project">
 <Tasks>
  <Task>
    0
    0
   <Name>PHASE 1</Name>
  </Task>
  <Task>
   1
   1
   <Name>PHASE 2</Name>
  </Task>
  <Task>
etc...

comme ceci
    Dim xmlFic As MSXML2.DOMDocument60
    Set xmlFic = New MSXML2.DOMDocument60

    xmlFic.async = False
    If xmlFic.Load("fichierXML") Then
        
        Dim xTitles As MSXML2.IXMLDOMElement
        Dim xTitle As MSXML2.IXMLDOMElement




        For Each xTitles In xmlFic.getElementsByTagName("Tasks")
            For Each xTitle In xTitles.getElementsByTagName("Task")
                  For j = 0 To xTitle.childNodes.Length - 1
                    Select Case UCase(xTitle.childNodes.Item(j).baseName)
                    Case "ID"
                        $ID = xTitle.childNodes.Item(j).text
                    Case "NAME"
                        $Nom = xTitle.childNodes.Item(j).text
                    end select
             next
         next

et bien cela fonctionne à la condition que la ligne du XML http://schemas.microsoft.com/project"> soit ! si il y a le xmlns=... ca marche point...

quelqu'un à une p'tite idée ?

11 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
plus propre ainsi (et fonctionne même avec le namespace) :

Dim oXml As DOMDocument
Dim oTask As IXMLDOMNode
Dim oNode As IXMLDOMNode
Dim sNom As String
Dim sID As String
Set oXml = New DOMDocument
oXml.async = False
If oXml.Load("c:\a.xml") Then
For Each oTask In oXml.selectNodes("Project/Tasks/Task")
Set oNode = oTask.selectSingleNode("ID")
If Not Nothing Is oNode Then
sID = oNode.Text
End If

Set oNode = oTask.selectSingleNode("Name")
If Not Nothing Is oNode Then
sNom = oNode.Text
End If

MsgBox sID & vbTab & sNom
Next oTask
End If
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Microsoft n'implémentera pas XPath 2.0, qui résolverait surement le souci...
donc la solution de virer le namespace reste une idée interessante.

suffit par exemple d'ajouter:
oXml.loadXML Replace(oXml.xml, "", "")

juste après le Load...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
a cause de ton namespace, encore une fois....

pour ton noeud:

Set oNode = xNoeud.selectSingleNode("Project/SaveVersion")
If Not Nothing Is oNode Then
MsgBox oNode.text
End If
Messages postés
234
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012

Alors c'est causé spécificiquement à cause du mot "xmlns=". Le contenu des parenthèses de xmlns n'y fait rien. Si à la place de "xmlns=" je met "aaaa=" ça marche !
Messages postés
234
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012

Ben écoute merci car je viens encore de chercher dans tous les coins de la planète  et nada. J'ai vu que je n'étais pas le seul à poser la question sur différent forum sans aucune solution
L' XML est un arbre qui cache une forêt avec ces XSD, Namespace et compagnies
Merci beaucoup pour ton aide; Je vais donc recodé proprement mon cafouilli ;)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
getElementsByTagName ne peut etre utilisé pour trouver un noeud qui a un namespace.
et ici, tous tes noeuds en possèdent un...
Messages postés
234
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012

Ok dorénavant je me base sur ta source.
Mais une question, j'ai évidement fait référence à Microsoft XMLv6.0

sur la déclaration Dim oXml As DOMDocument , moi j'avais pioché Dim oXml As DOMDocument60 vu qu'il y a le choix et bien avec Dim oXml As DOMDocument60 ça ne fonctionne pas. Bon j'ai donc laissé sans mais on utilise qd même la version 6 de l'objet microsoft ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
Tu as raison, DOMDocument60 est plus récent...

mais XPath 1.0 n'aime pas les namespaces sans préfixe, du coup, galère ton souci...

soi ajouter un préfixe, soi virer le namespace
Messages postés
234
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012

avant ta solution, j'ai pensé à virer ce namesspace, pas propre mais c'était une idée.

Mais idem... Vas-y voir pour ignorer ce namespace. La seule chose que j'ai imaginé était de lire le XML avant via OPEN... CLOSE et de faire le traitement. Mais ca faisait une bidouille vraiment pas propre

Sinon Xpath 1.0 est de la V6 ?
Messages postés
234
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012

T'es pas humain, c'est sur maintenant. Va falloir inventer un système plus pousser du Q.I.
Messages postés
234
Date d'inscription
mercredi 25 octobre 2000
Statut
Membre
Dernière intervention
5 octobre 2012

Si je peux me permettre une autre question
Dans la structure XML suivante :

http://schemas.microsoft.com/project">
<SaveVersion>12</SaveVersion> 
(...)
<Tasks>
  <Task>
   ...

Pour lire SaveSersion pourquoi ça ne passe pas ? :
        Set xNoeud = xmlFic.selectSingleNode("Project")
        Set oNode = xNoeud.selectSingleNode("SaveVersion")
        debug.print oNode.text

Peut-on y acceder plus simplement ?