あなたがXMLとしてエクスポートするnull値を強制することはできませんそうですね。 ADO行セットスキーマは、意図的に「省略」するように設計されています。
作成する特定のスキーマも指定しませんでしたが、必要に応じて簡単にADOスキーマを模倣することができます。
最高の方法は、プロセスを自分で管理することです。私はここにADOスキーマを模倣するために気にしませんでしたがここではSAXの例である:
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
入力データ:
LongVal,StringVal,DoubleVal
65536,Fred,3.5
,Has-Null,1.23456
65537,Barney,37
出力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>
あなたは可能性もbrute-物事を強制し、従来のロジックと組み込みのVB6 I/Oステートメントを使用してファイルとして書き出します。真のUTF-8出力が必要な場合や、XMLスキーマがより複雑な場合はちょっとトリッキーです。
サーバーブ77 .. あなたはメールを持っていますか? –
現在就職活動は行っていません。 – Bob77