Sie können einen Nullwert erzwingen als XML zu exportieren dieser Weg. Das ADO-Rowset-Schema wurde entworfen, um sie absichtlich "wegzulassen".
Sie haben auch kein bestimmtes Schema zum Erstellen angegeben, aber Sie können das ADO-Schema leicht nachahmen, wenn Sie das möchten.
Der beste Weg ist, die Kontrolle über den Prozess selbst zu übernehmen. Hier ist ein SAX Beispiel wenn ich nicht die Mühe, das ADO-Schema zu imitieren hier:
Option Explicit
'
'Requires references to:
'
' Microsoft ActiveX Data Objects, version 2.5 or later.
' Microsoft XML 6.0, can be rewritten to use 3.0 as well.
'
Private Enum HRESULT
S_OK = 0
End Enum
Private Enum STGM
STGM_READ = &H0&
STGM_WRITE = &H1&
STGM_READWRITE = &H2&
STGM_SHARE_EXCLUSIVE = &H10&
STGM_SHARE_DENY_WRITE = &H20&
STGM_SHARE_DENY_READ = &H30&
STGM_SHARE_DENY_NONE = &H40&
STGM_FAILIFTHERE = &H0&
STGM_CREATE = &H1000&
End Enum
Private Declare Function SHCreateStreamOnFile Lib "shlwapi" _
Alias "SHCreateStreamOnFileW" (_
ByVal pszFile As Long, _
ByVal grfMode As STGM, _
ByRef stm As IUnknown) As HRESULT
Private Sub CustomSaveXML(_
ByVal Recordset As ADODB.Recordset, _
ByVal FilePath As String)
Dim Stream As IUnknown
Dim HRESULT As HRESULT
Dim Attributes As SAXAttributes60
Dim Writer As MSXML2.MXXMLWriter60
Dim Handler As MSXML2.IVBSAXContentHandler
Dim Field As ADODB.Field
Dim StringValue As String
Set Stream = Nothing 'Force creation on 64-bit Windows. Not sure why
'this is required or why it works.
HRESULT = SHCreateStreamOnFile(StrPtr(FilePath), _
STGM_CREATE _
Or STGM_WRITE _
Or STGM_SHARE_EXCLUSIVE, _
Stream)
If HRESULT <> S_OK Then
Err.Raise &H80044900, _
"CustomSaveXML", _
"SHCreateStreamOnFile error " & Hex$(HRESULT)
End If
Set Attributes = New MSXML2.SAXAttributes60
Set Writer = New MSXML2.MXXMLWriter60
Set Handler = Writer
With Writer
.omitXMLDeclaration = True
.standalone = True
.disableOutputEscaping = False
.indent = True
.encoding = "utf-8"
.output = Stream
End With
With Handler
.startDocument
.startElement "", "", "data", Attributes
Do Until Recordset.EOF
With Attributes
For Each Field In Recordset.Fields
Select Case VarType(Field.Value)
Case vbNull
'Force as empty String:
StringValue = ""
Case vbString
StringValue = Field.Value
Case Else
'This converts to a String value using the
'Invariant Locale:
StringValue = LTrim$(Str$(Field.Value))
End Select
.addAttribute "", "", Field.Name, "", StringValue
Next
End With
.startElement "", "", "row", Attributes
.endElement "", "", "row"
Attributes.Clear
Recordset.MoveNext
Loop
.endElement "", "", "data"
.endDocument
End With
End Sub
Private Sub Main()
Dim RS As ADODB.Recordset
With New ADODB.Connection
.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='.';" _
& "Extended Properties='Text;CSVDelimited=True;Hdr=True'"
Set RS = .Execute("sample.csv", , adCmdTableDirect)
CustomSaveXML RS, "sample2.xml"
RS.Close
.Close
End With
End Sub
Eingangsdaten:
LongVal,StringVal,DoubleVal
65536,Fred,3.5
,Has-Null,1.23456
65537,Barney,37
Output XML:
<data>
<row LongVal="65536" StringVal="Fred" DoubleVal="3.5"/>
<row LongVal="" StringVal="Has-Null" DoubleVal="1.23456"/>
<row LongVal="65537" StringVal="Barney" DoubleVal="37"/>
</data>
Sie könnten auch Brute Erzwinge Dinge und schreibe sie einfach als Datei mit konventioneller Logik und den intrinsischen VB6-I/O-Anweisungen. Es wird nur ein kleiner Trick, wenn Sie eine echte UTF-8-Ausgabe oder etwas benötigen, oder Ihr XML-Schema ist komplexer.
Sir Bob77 .. Haben Sie Email .. ?? –
Wir nehmen derzeit keine Bewerbungen an. – Bob77