XML et attribut

Résolu
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012 - 7 juil. 2009 à 19:03
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 8 juil. 2009 à 14:40
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 juil. 2009 à 08:04
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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 juil. 2009 à 10:47
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...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 juil. 2009 à 14:40
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
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
8 juil. 2009 à 07:27
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 !

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
8 juil. 2009 à 08:10
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 ;)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 juil. 2009 à 08:25
getElementsByTagName ne peut etre utilisé pour trouver un noeud qui a un namespace.
et ici, tous tes noeuds en possèdent un...
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
8 juil. 2009 à 09:29
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 ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 juil. 2009 à 10:23
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
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
8 juil. 2009 à 10:31
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 ?
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
8 juil. 2009 à 10:54
T'es pas humain, c'est sur maintenant. Va falloir inventer un système plus pousser du Q.I.
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
8 juil. 2009 à 14:35
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 ?
Rejoignez-nous