Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre habitué
    Homme Profil pro Michaël
    Développeur .NET
    Inscrit en
    avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Nom : Homme Michaël
    Âge : 32
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2008
    Messages : 97
    Points : 107
    Points
    107

    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 :
    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 :
    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 :
    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

    Inscrit en
    septembre 2004
    Messages
    9 476
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 476
    Points : 14 302
    Points
    14 302

    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 ?

  3. #3
    Membre habitué
    Homme Profil pro Michaël
    Développeur .NET
    Inscrit en
    avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Nom : Homme Michaël
    Âge : 32
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2008
    Messages : 97
    Points : 107
    Points
    107

    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 :
    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

    Inscrit en
    septembre 2004
    Messages
    9 476
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 476
    Points : 14 302
    Points
    14 302

    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.

  5. #5
    Membre habitué
    Homme Profil pro Michaël
    Développeur .NET
    Inscrit en
    avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Nom : Homme Michaël
    Âge : 32
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2008
    Messages : 97
    Points : 107
    Points
    107

    Par défaut

    Excellent, ca fonctionne:

    Code :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •