2009-12-08 14 views
1

J'utilise une variante sur le code vu dans "How to make XMLDOMDocument include the XML Declaration?" (qui peut également être vu à MSDN.) Si je change l'encodage en "UTF-16" on pourrait penser qu'il serait sortie en UTF-16 ... et "fait" ... en regardant la sortie dans un éditeur de texte, mais en la vérifiant dans un éditeur hexadécimal, la marque de l'ordre des octets est manquante (bien que la propriété ait la valeur true) , et les éditeurs XML rejettent le document comme non valide UTF-16, pour laMSXMLWriter60 ne sort pas byteOrderMark pour l'encodage UTF-16

BOM manquant

Qu'est-ce que je méconnais

'' # Create and load a DOMDocument object. 

Dim xmlDoc As New DOMDocument60 
xmlDoc.loadXML("<doc><one>test1</one><two>test2</two></doc>") 

'' # Set properties on the XML writer - including BOM, XML declaration and encoding 

Dim wrt As New MXXMLWriter60 
wrt.byteOrderMark = True 
wrt.omitXMLDeclaration = False 
wrt.encoding = "UTF-16" 
wrt.indent = False 

'' # Set the XML writer to the SAX content handler. 

Dim rdr As New SAXXMLReader60 
Set rdr.contentHandler = wrt 
Set rdr.dtdHandler = wrt 
Set rdr.errorHandler = wrt 
rdr.putProperty "http://xml.org/sax/properties/lexical-handler", wrt 
rdr.putProperty "http://xml.org/sax/properties/declaration-handler", wrt 

'' # Now pass the DOM through the SAX handler, and it will call the writer 

rdr.parse xmlDoc 

'' # Let the writer do its thing 

Dim iFileNo As Integer 
iFileNo = FreeFile 
Open App.Path + "\saved.xml" For Output As #iFileNo 
Print #iFileNo, wrt.output 
Close #iFileNo 

la sortie ressemble à:.?

<?xml version="1.0" encoding="UTF-16" standalone="no"?> 
<doc><one>test1</one><two>test2</two></doc> 

Pourquoi suis-je utiliser VB6? C'est en fait dans VBA (même génération, léger sous-ensemble de VB6), utilisé comme langage de script pour InputAccel/FormWare d'EMC-Captiva, donc la commutation n'est pas une option.

Répondre

2

Le problème est que lorsque vous récupérez une valeur de la propriété de sortie de l'enregistreur, vous obtenez une chaîne. Puisque les chaînes dans VB sont toujours UTF-16 c'est ce que vous obtenez indépendamment de l'encodage. Puisque les chaînes sont toujours UTF-16 dans VB, il n'y a aucune notion de celles-ci nécessitant une nomenclature, ce qui n'est pas inclus non plus.

Les propriétés de codage et de nomenclature n'affectent que la manière dont le rédacteur écrit le code XML lorsqu'une implémentation de IStream est affectée à la propriété de sortie .

Essayez vous modifier le code dans l'appel à analyser comme suit: -

Dim oStream As ADODB.Stream 
Set oStream = New ADODB.Stream 
oStream.Open 
oStream.Type = adTypeBinary 

wrt.output = oStream 

rdr.parse xmlDoc 

oStream.SaveToFile App.Path + "\saved.xml" 
oStream.Close 

Cela devrait générer la sortie désirée.

+0

Confirmé, j'ai obtenu le même résultat d'une autre manière. Il est important de définir la propriété de sortie * first *, avant les autres propriétés ou vous n'obtiendrez toujours pas la nomenclature. –

+0

@nobugz: Oui, une bonne capture, l'assignation à la propriété de sortie doit avoir lieu avant d'assigner les autres propriétés. – AnthonyWJones

+0

"oStream.Type = adTypeBinary" dans mon VBA, mais cela a fait l'affaire. Merci! –