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