【问题标题】:Loading Dataset gives error: Source XML is incomplete or invalid加载数据集给出错误:源 XML 不完整或无效
【发布时间】:2011-08-19 04:12:55
【问题描述】:

当我从 VBA 中的文件加载数据集时出现错误。

?RsLoadFromXML("c:\sletmig\test.xml")

无法创建记录集。源 XML 不完整或无效。

这是我的源代码

    Function RsLoadFromXML(sPath As String) As Recordset
    Dim oStream As ADODB.Stream, oRsLoad As ADODB.Recordset

    On Error GoTo ErrFailed

    Set oRsLoad = New ADODB.Recordset
    oRsLoad.CursorLocation = adUseClient

    Set oStream = New ADODB.Stream
    oStream.Charset = "iso-8859-1"
    oStream.Open
    'Load stream
    oStream.LoadFromFile sPath

    'Open recordset using stream
    oRsLoad.Open oStream
    Set RsLoadFromXML = oRsLoad

    oStream.Close
    Set oStream = Nothing
    Set oRsLoad = Nothing

    Exit Function

ErrFailed:
    Debug.Print Err.Description
    Debug.Assert False
    Set RsLoadFromXML = Nothing
End Function

正在尝试加载这个 test.xml 文件

<?xml version="1.0"?>
<Instruments>
<Control>
<AnalysisNotional>1000000</AnalysisNotional>
<TAsOf>18/08/2011</TAsOf>
<NumberOfDays>1</NumberOfDays>
</Control>
</Instruments>

【问题讨论】:

  • 我很确定 ADO 不能用于将任何随机 XML 转换为记录集:它必须是一个 XML 文件,最初是通过将现有 ADO 记录集保存到文件中创建的...

标签: xml vba dataset


【解决方案1】:

@Tim Williams 是正确的...ADO 可以处理的 XML 专门用于由 Recordset.Save (see this) 创建的持久记录集。

如果您错过了细则,来自 Microsoft 的This article 可能会产生误导:“只要 XML 数据采用 ADO 记录集可以接受的格式。”

如果要加载通用 XML 文件,请使用 Microsoft XML(在 Office 中,您需要添加对“Microsoft XML #.#”的引用。您可以在 Visual Basic 编辑器的工具->引用中执行此操作。 )

Sub XML()
    Dim oDoc As MSXML2.DOMDocument
    Set oDoc = New MSXML2.DOMDocument
    oDoc.Load ("C:\Path\To\File\AnXMLFile.xml")
End Sub

如果您需要更多信息,请告诉我。

编辑:你每天都会学到新东西。恕我直言,这实际上很酷。由于您需要记录集中的数据,因此您可以创建一个没有后备数据库的记录集并向其中添加数据。 (Source article)

Sub XML()
    Dim oDoc As MSXML2.DOMDocument
    Dim oRS As ADODB.Recordset
    Dim oNode As MSXML2.IXMLDOMNode
    Dim oSubNodes As MSXML2.IXMLDOMSelection

    Set oDoc = New MSXML2.DOMDocument
    oDoc.Load ("C:\Path\To\File\AnXMLFile.xml")

    Set oRS = New ADODB.Recordset
    Set oRS.ActiveConnection = Nothing
    oRS.CursorLocation = adUseClient
    oRS.LockType = adLockBatchOptimistic


    With oRS.fields
        .Append "AnalysisNotional", adInteger
        .Append "TAsOf", adDate
        .Append "NumberOfDays", adInteger
    End With

    oRS.Open

    For Each oNode In oDoc.selectNodes("/Instruments/Control")
        oRS.AddNew
        oRS.fields("AnalysisNotional").Value = oNode.selectSingleNode("AnalysisNotional").Text
        oRS.fields("TAsOf").Value = oNode.selectSingleNode("TAsOf").Text
        oRS.fields("NumberOfDays").Value = oNode.selectSingleNode("NumberOfDays").Text
    Next

    oRS.MoveFirst

    '--- Do something with recordset here ---
End Sub

【讨论】:

    【解决方案2】:

    谢谢。我尝试创建一些示例代码,但 XML 看起来很奇怪,所以我会尝试您的建议。

    Sub Create_recordset()
        Dim r As ADODB.Recordset
        Dim strFileName As String
    
        strFileName = "d:\sletmig\test.txt"
    
    
        Set r = New ADODB.Recordset
    
        'Add Columns
        r.Fields.Append "Field1", adVarWChar, 50
        r.Fields.Append "Field2", adVarWChar, 50
    
        'Create Recordset
        r.Open
    
        'Add rows into recordset
        r.AddNew Array("field1", "field2"), Array("string1", “val1”)
        r.AddNew Array("field1", "field2"), Array("string2", “val2”)
    
        On Error Resume Next
        Kill strFileName
    
        r.Save strFileName, adPersistXML
    
        r.Close
        Set r = Nothing
    
    End Sub
    

    给我这个xml文件

    <xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
        xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
        xmlns:rs='urn:schemas-microsoft-com:rowset'
        xmlns:z='#RowsetSchema'>
    <s:Schema id='RowsetSchema'>
        <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
            <s:AttributeType name='Field1' rs:number='1' rs:write='true'>
                <s:datatype dt:type='string' dt:maxLength='50' rs:precision='0' rs:maybenull='false'/>
            </s:AttributeType>
            <s:AttributeType name='Field2' rs:number='2' rs:write='true'>
                <s:datatype dt:type='string' dt:maxLength='50' rs:precision='0' rs:maybenull='false'/>
            </s:AttributeType>
            <s:extends type='rs:rowbase'/>
        </s:ElementType>
    </s:Schema>
    <rs:data>
        <rs:insert>
            <z:row Field1='string1' Field2=''/>
            <z:row Field1='string2' Field2=''/>
        </rs:insert>
    </rs:data>
    </xml>
    

    【讨论】:

    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多