2010-10-26 1 views
0

Что мне нужно сделать, так это dump XML String в RecordSet. Проблема, с которой я сталкиваюсь, заключается в том, что код работает нормально, если я сначала сохранил XML-строку в файле, а затем прочитал из файла, который, как мне кажется, лишний. Однако, когда я хочу прочитать строку, я получаю сообщение об ошибкеПомощь передачи XML-строки в RecordSet

RecordSet не может быть создан. Исходный XML является неполным или недействительным. 80004005

Мой XML Строка в виде

<portfolio> 
    <stock> 
     <shares>100</shares> 
     <symbol>MSFT</symbol> 
     <price>$70.00</price> 
     <info> 
     <companyname>Microsoft Corporation</companyname> 
     <website>http://www.microsoft.com</website> 
     </info> 
    </stock> 
    <stock> 
     <shares>100</shares> 
     <symbol>AAPL</symbol> 
     <price>$107.00</price> 
     <info> 
     <companyname>Apple Computer, Inc.</companyname> 
     <website>http://www.apple.com</website> 
     </info> 
    </stock> 
    <stock> 
     <shares>100</shares> 
     <symbol>DELL</symbol> 
     <price>$50.00</price> 
     <info> 
     <companyname>Dell Corporation</companyname> 
     <website>http://www.dell.com</website> 
     </info> 
    </stock> 
    <stock> 
     <shares>100</shares> 
     <symbol>INTC</symbol> 
     <price>$115.00</price> 
     <info> 
      <companyname>Intel Corporation</companyname> 
      <website>http://www.intel.com</website> 
     </info> 
    </stock> 
</portfolio> 

И кода я использую для преобразования XML-строки (То, что я имею проблему с) является

Public Function RecordsetFromXMLString(sXML As String) As Recordset 

    Dim oStream As ADODB.Stream 
    Set oStream = New ADODB.Stream 

    oStream.Open 
    oStream.WriteText sXML 'Give the XML string to the ADO Stream 

    oStream.Position = 0 'Set the stream position to the start 

    Dim oRecordset As ADODB.Recordset 
    Set oRecordset = New ADODB.Recordset 

    oRecordset.Open oStream 'Open a recordset from the stream 

    oStream.Close 
    Set oStream = Nothing 

    Set RecordsetFromXMLString = oRecordset 'Return the recordset 

    Set oRecordset = Nothing 

End Function 

Пожалуйста, ваша помощь будет принята с благодарностью.

http://msdn.microsoft.com/en-us/library/ms810621

http://support.microsoft.com/kb/263247

Я уже пытался использовать это ниже

Public Function RecordsetFromXMLDocument(XMLDOMDocument) 
    Dim oRecordset 
    Set oRecordset = CreateObject("ADODB.Recordset.6.0") 
    oRecordset.Open XMLDOMDocument 'pass the DOM Document instance as the Source argument 

    Set RecordsetFromXMLDocument = oRecordset 'return the recordset 

    Set oRecordset = Nothing 
End Function 

Но все-таки столкнулся с той же проблемой.


кода я форматировать мой DomDocumentData в Persistent формат ADO XML я необходимый для этого

'******************************************************************************************* 
' SCHEMA GENERATOR 
'******************************************************************************************* 
'parentnodepath -- XPath to the Main Node/Table/RowCollection 
'parentnodepath -- Name of the Main Node/Table/RowCollection 
Function CreateSchemafromNode(XMLDocument,parentnodepath, parentnodeName) 
     Dim schema, stemp, MyArray,nodename, childnodelist,counter, n, x, tempnode 
     schema = TextWriterSchemaNameSpaceHeader() 
     schema=schema & TextWriterSchemaHeader(parentnodeName) 
     'LOOP HERE 
      counter = 0 

      For Each stemp In XMLDocument.SelectSingleNode(parentnodePath).ChildNodes(0).ChildNodes 
        counter = counter + 1 
        schema = schema & TextWriterSchemaRowAttributeElement(stemp.NodeName, counter, "") 
      Next 
     'END LOOOP HERE 
      schema=schema & TextWriterSchemaSchemaEnd 
      schema =schema & TextWriterSchemaRowHeader 
      'BEGIN FIRST LOOP HERE -- FOR EACH TOP NODE --ROW 
       For Each n In XMLDocument.SelectSingleNode(parentnodePath).ChildNodes 
         schema =schema & TextWriterSchemaAddRowBegin() 
        'BEGIN SECOND LOOP HERE -- FOR EACH CHILD OF TOP NODE -- NODE VALUE IN CURRENT ROW -- FOR EACH CHILDNODELIST NAME 
        For Each x In n.ChildNodes 
          schema = schema & TextWriterSchemaAddRowFieldNameValue(x.NodeName, x.text) 
        'END SECOND LOOP HERE 
        Next 
        schema =schema & TextWriterSchemaAddRowEnd() 
      Next 
     'END FIRST LOOP HERE 
     schema =schema & TextWriterSchemaRowEnd() 
     schema =schema &TextWriterSchemaNameSpaceEnd() 

     CreateSchemafromNode=schema 
End Function 


Function TextWriterSchemaNameSpaceHeader() 
    Dim schemaString 

    schemaString= "<xml xmlns:s='" 
    schemaString= schemaString & "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' " & vbCrLf & vbTab 
    schemaString= schemaString & ("xmlns:dt='") 
    schemaString= schemaString & "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' " & vbCrLf & vbTab 
    ' schemaString= schemaString & ("xmlns:dt='") 
    ' schemaString= schemaString & "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882' " & vbCrLf & vbTab 
    schemaString= schemaString & "xmlns:rs='urn:schemas-microsoft-com:rowset' " & vbCrLf & vbTab 
    schemaString=schemaString & " xmlns:z='#RowsetSchema'> " & vbCrLf 
    TextWriterSchemaNameSpaceHeader = schemaString 
End Function 


Function TextWriterSchemaHeader(recordname) 
    Dim schemaString 
      schemaString= "<s:Schema id='RowsetSchema'>"& vbCrLf & vbTab 
      schemaString= schemaString &"<s:ElementType name='" & recordname & "' content='eltOnly'>" & vbCrLf 
      TextWriterSchemaHeader = schemaString 
End Function 

Function TextWriterSchemaRowAttributeElement(rowname, rowordernumber, rowtype) 
    Dim schemaString 
     schemaString=vbTab & vbTab & "<s:AttributeType name='" & rowname & "' rs:number='" & rowordernumber & "' />" & vbCrLf 
     TextWriterSchemaRowAttributeElement = schemaString 
End Function 

Function TextWriterSchemaSchemaEnd() 
     Dim schemaString 
     schemaString=vbTab & vbTab & "<s:extends type='rs:rowbase'/>" & vbCrLf 
     schemaString= schemaString &vbTab & "</s:ElementType>" & vbCrLf 
     schemaString= schemaString & "</s:Schema>" & vbCrLf 
     TextWriterSchemaSchemaEnd =schemaString 
End Function 

Function TextWriterSchemaRowHeader() 
     Dim schemaString 
      schemaString= vbTab & "<rs:data>" & vbCrLf 
      TextWriterSchemaRowHeader = schemaString 
End function 

Function TextWriterSchemaAddRowBegin() 
     Dim schemaString 
     schemaString=vbTab & "<z:row " 
     TextWriterSchemaAddRowBegin=schemaString 
End function 

Function TextWriterSchemaAddRowFieldNameValue(FieldName, FieldValue) 
    Dim schemaString 
      schemaString= FieldName & "='" & FieldValue & "' " 
      TextWriterSchemaAddRowFieldNameValue=schemaString 
End function 

Function TextWriterSchemaAddRowEnd() 
     Dim schemaString 
      schemaString="/>" & vbCrLf 
      TextWriterSchemaAddRowEnd=schemaString 
End function 


Function TextWriterSchemaRowEnd() 
     Dim schemaString 
       schemaString=vbTab & "</rs:data>" & vbCrLf 
       TextWriterSchemaRowEnd=schemaString 
End function 

Function TextWriterSchemaNameSpaceEnd() 
     Dim schemaString 
       schemaString="</xml>" & vbCrLf 
       TextWriterSchemaNameSpaceEnd=schemaString 
End Function 

ответ

0

Вы получаете эту ошибку, потому что XML вы поставляете не в том формате, который ADODB .Recordset понимает. Формат должен быть похож на следующий, который основан на XML-Data Reduced Schema. См. Документацию на ADO XML Persistence Format Protocol для получения дополнительной информации.

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882' 
    xmlns:rs='urn:schemas-microsoft-com:rowset' 
    xmlns:z='#RowsetSchema'> 
<s:Schema id='RowsetSchema'> 
    <s:ElementType name='row' content='eltOnly'> 
     <s:AttributeType name='shares' rs:number='1' /> 
     <s:AttributeType name='symbol' rs:number='2' /> 
     <s:AttributeType name='price' rs:number='3' /> 
     <s:extends type='rs:rowbase'/> 
    </s:ElementType> 
</s:Schema> 
<rs:data> 
    <z:row shares='100' symbol='MSFT' price='$70.00' /> 
    <z:row shares='100' symbol='AAPL' price='$107.00' /> 
    <z:row shares='100' symbol='DELL' price='$50.00' /> 
</rs:data> 
</xml> 

В прошлом при работе с ADO и XML, которые я использовал XSLT превратить свой формат XML в формат XML ADO. Вы также можете сделать это программно. Вот несколько примеров (они не VB6, но должны дать вам представление о том, что нужно).

http://support.microsoft.com/kb/316337

http://msdn.microsoft.com/en-us/magazine/cc301468.aspx

http://etutorials.org/Programming/Web+Solutions+based+on+ASP.NET+and+ADO.NET/Part+III+Interoperability/Interoperable+Web+Applications/From+DataSet+Objects+to+ADO+Recordset+Objects/

+0

Если бы я построить свой XML так, как у вас есть там путем добавления строк, это будет работать нормально, или есть возможность в MSXML2 или выше, что может помощь в преобразовании моей строки XML в правильный формат? – Kobojunkie

+0

Вы также можете просто использовать API-интерфейс MSXML для создания DOMDocument и использовать его в параметре для метода 'Open'' Recordset', потому что он может использовать любой объект, который реализует интерфейс 'IStream', который выполняет IXMLDOMDocument. См. Http://support.microsoft.com/kb/263247 – Garett

+0

Я пробовал этот подход из этой самой ссылки, передавая в objXMLDoc2 = CreateObject («MSXML2.DOMDocument.3.0») и столкнулся с той же проблемой. – Kobojunkie

 Смежные вопросы

  • Нет связанных вопросов^_^