2010-10-26 17 views
0

Ce que je voudrais faire est de vider une chaîne XML dans RecordSet. Le problème que je rencontre est que le code semble fonctionner correctement si j'ai d'abord enregistré la chaîne XML dans un fichier, puis j'ai lu le fichier qui, je pense, est redondant. Toutefois, lorsque je veux lire à partir d'une chaîne, j'obtiens l'erreurAide passant XML String à RecordSet

RecordSet ne peut pas être créé. La source XML est incomplète ou invalide. 80004005

Ma chaîne XML est sous la forme

<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> 

Et le code que je utilise pour convertir la chaîne XML (que j'ai le problème avec) est

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 

S'il vous plaît, Votre aide sera grandement appréciée.

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

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

je l'ai déjà essayé d'utiliser ce ci-dessous

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 

Mais encore rencontré le même problème.


Code I utilisé pour formater mon DomDocumentData dans le format persistant XML ADO I requis pour cette

'******************************************************************************************* 
' 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 

Répondre

0

Vous obtenez cette erreur, parce que le XML que vous fournissez n'est pas dans le format ADODB .Recordset comprend. Le format doit ressembler à ce qui suit, qui est basé sur XML-Data Reduced Schema. Voir la documentation sur le ADO XML Persistence Format Protocol pour plus d'informations.

<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> 

Dans le passé, lorsque vous travaillez avec ADO et XML je l'ai utilisé XSLT pour transformer mon format XML au format XML ADO. Vous pouvez également le faire par programme. Voici quelques exemples (Ils ne sont pas VB6, mais devraient vous donner une idée de ce qui est nécessaire).

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

Si je devais construire mon XML dans la façon dont vous avez là en ajoutant des chaînes, serait que fin de travail ou est-il une fonction dans MSXML2 ou supérieur qui pourrait aider à convertir ma chaîne XML au bon format? – Kobojunkie

+0

Vous pouvez également utiliser l'API MSXML pour créer un DOMDocument et l'utiliser au paramètre de la méthode 'Open' de' Recordset', car il peut utiliser n'importe quel objet qui implémente l'interface 'IStream', ce que fait IXMLDOMDocument. Voir http://support.microsoft.com/kb/263247 – Garett

+0

J'ai essayé cette approche à partir de ce même lien, passant dans objXMLDoc2 = CreateObject ("MSXML2.DOMDocument.3.0") et rencontré le même problème. – Kobojunkie