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

APIs XML Discussion :

[SAX] Comment parser un xml et le sauver en gardant le DTD inclu [DOM]


Sujet :

APIs XML

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2008
    Messages : 97
    Points : 143
    Points
    143
    Par défaut [SAX] Comment parser un xml et le sauver en gardant le DTD inclu
    Bonjour,

    Je crée un vbscript qui parcours plusieurs fichiers séquentiels à fin de rassembler toutes les données dans un seul fichier xml.

    J'ai besoin d'utiliser la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set xmlDoc = CreateObject("Microsoft.XMLDOM")
    xmlDoc.nodeFromID(stopId)
    , comme ça si le script à déja été lancé et que fichier xml existe déjà, je n'ajoute que les nouveau éléments.


    et je lis dans la doc msdn:

    To reference a node with nodefromID, the node must be typed as ID in the schema or document type definition (DTD). Simply naming an attribute "ID" does not set its data type.
    Du coup, lorsque je crée mon fichier j'ajoute le DTD:

    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
    Function GetNewXmlWaypointDoc(xmlDoc)
    	set xmlWriter = CreateObject("MSXML2.MXXMLWriter")
    	xmlWriter.output = ""
    	xmlWriter.indent = True
    	xmlWriter.encoding = "ISO-8859-1"
    	xmlWriter.standalone = True
     
    	xmlWriter.startDocument
    	xmlWriter.startDTD "Waypoints", "", ""
    	xmlWriter.elementDecl "Waypoints", "(Stop*)"
    	xmlWriter.attributeDecl "Waypoints", "datum", "CDATA", "#REQUIRED", ""
    	xmlWriter.elementDecl "Stop", "(Waypoint+)"
    	xmlWriter.attributeDecl "Stop", "id", "ID", "#REQUIRED", ""
    	xmlWriter.elementDecl "Waypoint", "(Latitude, Longitude)"
    	xmlWriter.attributeDecl "Waypoint", "date", "CDATA", "#REQUIRED", ""
    	xmlWriter.elementDecl "Latitude", "ANY"
    	xmlWriter.elementDecl "Longitude", "ANY"
    	xmlWriter.endDTD
    	set saxAttributes = CreateObject("MSXML2.SAXAttributes")
    	saxAttributes.addAttribute "", "", "datum", "CDATA", "WGS84"
    	xmlWriter.startElement "", "", "Waypoints", saxAttributes
    	xmlWriter.endElement "", "", "Waypoints"
    	saxAttributes.Clear
     
    	xmlWriter.endDocument
    	xmlWriter.flush
     
     	If NOT xmlDoc.LoadXML(xmlWriter.output) Then
    		MsgBox xmlDoc.parseError.reason
    	End If
     
    	Set xmlWriter = Nothing
    End Function
    puis je remplis mon xmlDoc avec des choses plus merveilleuses les unes que les autres.

    Enfin pour que la présentation soit jolie je veux parser mon xmlDoc et le sauver.
    Je procède comme ceci:
    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
    Function ParseAndSave(filePath, xmlDoc)
    	set xmlWriter = CreateObject("MSXML2.MXXMLWriter") 
    	set xmlReader = CreateObject("MSXML2.SAXXMLReader")
    	Set xmlStream = CreateObject("ADODB.STREAM")
    	xmlStream.Open
    	xmlStream.Charset = "ISO-8859-1"
     
    	xmlWriter.output = xmlStream
    	Set xmlReader.contentHandler = xmlWriter
    	Set xmlReader.DTDHandler = xmlWriter
    	Set xmlReader.errorHandler = xmlWriter
    	xmlReader.parse xmlDoc
    	xmlWriter.flush
     
    	xmlStream.SaveToFile filePath, 2
     
    	xmlStream.Close
    	Set xmlStream = Nothing
    	Set xmlReader = Nothing
    	Set xmlWriter = Nothing
    End Function
    Ca sauve bien le fichier xml mais sans le dtd... comment faire pour que le dtd soit ajouté au fichier?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hum. En Java, pour lire les évènements SAX de la DTD on utilise un LexicalHandler et un DeclHandler (qui d'ailleurs, ne suffisent à lire que les DTDs les plus simples.) Mais je ne sais pas si ça existe en vbscript.

    Personnellement, dans ces cas-là, je ne mets dans la DTD que ce dont j'ai besoin (dans ton cas, déclaration de la liste d'attributs, pour déclarer l'attribut de type ID) et je customise mon sérialiseur XML pour l'ajouter à chaque fois au lieu de le recopier tel que.
    Ou, dans les cas où c'est plus simple, j'externalise le fichier .dtd.

    En fait, maintenant que j'y pense, as-tu absolument besoin de nodeFromID() ? Une petite requête XPath ne marcherait pas aussi bien ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2008
    Messages : 97
    Points : 143
    Points
    143
    Par défaut
    Si tu utilises "MSXML2.SAXXMLReader" en java, c'est le même api donc que ce soit java ou vbscript c'est kif-kif.

    Et donc effectivement le lexicalHandler semble être la bonne piste

    Malheureusement je ne saurai tester que demain mais en regardant dans msdn je lis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The ISAXLexicalHandler/IVBSAXLexicalHandler interface enables a Simple API for XML (SAX2) application to implement an optional extension handler for receiving information from the SAX2 reader, such as comments, the document type declaration, CDATA sections, and the start and end of an entity within a document.
    Ca sent donc bon

    L'utilisation de la méthode putproperty() du reader n'est pas forcément intuitive.

    Puis j'essayerai avec une petite requête Xpath, j'apprends petit à petit, je ne maitrise encore pas grand chose en xml, je suis donc pour l’essai de plein de solutions.

    Je te tiens au courant.

    Merciii

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par mkl238 Voir le message
    Si tu utilises "MSXML2.SAXXMLReader" en java, c'est le même api donc que ce soit java ou vbscript c'est kif-kif.
    Ah peut-être mais j'utilise rien de ce genre. Java a ses propres API SAX très bien documentées qui s'appellent XMLReader et SAXParser.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2008
    Messages : 97
    Points : 143
    Points
    143
    Par défaut
    Excellent, ca fonctionne:

    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
    Function ParseAndSave(filePath, xmlDoc)
    	set xmlWriter = CreateObject("MSXML2.MXXMLWriter")
    	set xmlReader = CreateObject("MSXML2.SAXXMLReader")
    	Set xmlStream = CreateObject("ADODB.STREAM")
    	xmlStream.Open
    	xmlStream.Charset = "ISO-8859-1"
     
    	xmlWriter.output = xmlStream
    	xmlWriter.indent = True
    	xmlWriter.standalone = True
     
    	Set xmlReader.contentHandler = xmlWriter
    	Set xmlReader.DTDHandler = xmlWriter
    	Set xmlReader.errorHandler = xmlWriter
    	xmlReader.putProperty "http://xml.org/sax/properties/lexical-handler", xmlWriter
    	xmlReader.putProperty "http://xml.org/sax/properties/declaration-handler", xmlWriter
     
    	xmlReader.parse xmlDoc
    	xmlWriter.flush
     
    	xmlStream.SaveToFile filePath, 2
     
    	xmlStream.Close
    	Set xmlStream = Nothing
    	Set xmlWriter = Nothing
    	Set xmlReader = Nothing
    End Function

    Un tout grand merci

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

Discussions similaires

  1. [PHP] Comment parser un XML sans racine ?
    Par Samax dans le forum Langage
    Réponses: 1
    Dernier message: 03/02/2011, 13h27
  2. [XML] [SAX] Comment Parser du XML
    Par Masterlud dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 17/04/2007, 20h26
  3. [XML] Comment parser ce fichier XML avec java !
    Par jlassira dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 13/03/2006, 12h56
  4. [DOM XML] Comment parser du XML avec une version 4.3 ?
    Par ouioui2000 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 18/10/2005, 15h52
  5. [XML] Comment parser ?
    Par GLDavid dans le forum Modules
    Réponses: 7
    Dernier message: 03/03/2005, 02h59

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