dmv VBA text info uit een XML file halen naar Excel

Status
Niet open voor verdere reacties.

Orcaa

Gebruiker
Lid geworden
1 nov 2010
Berichten
125
Wil graag mbv VBA verschillende velden uit een XML file inlezen in een Excel sheet.

Nu lukt het gedeeltelijk, maar loop ik vast .

De XML file ziet er als volgt uit:

Code:
<?xml version="1.0" ?> 
<transfer style="startstop" date="2013-08-26 12:36:11.000" serial_number="E5XX-0909" vtl="0" frmt="1">
 <plateInfo>
  <plate type="source" name="Corning_1536COC_HiBase" barcode="U001687" /> 
  <plate type="destination" name="Corning1536" barcode="13LAMT002045A" /> 
 </plateInfo>
</transfer>


De VBA code die ik tot nu toe heb is zo:

Code:
Sub xmltest_transfer_all()

Dim xmlDoc As DOMDocument30
Set xmlDoc = New DOMDocument30
xmlDoc.Load ("H:\Data\2013\Software\Excel_Macros\XML_examples\transfer.xml")

barcodetype = xmlDoc.SelectSingleNode("//plateInfo/plate").Attributes.getNamedItem("type").Text
barcodename = xmlDoc.SelectSingleNode("//plateInfo/plate").Attributes.getNamedItem("name").Text
barcodesource = xmlDoc.SelectSingleNode("//plateInfo/plate").Attributes.getNamedItem("barcode").Text

End Sub
Nu krijg ik de gegevens van de eerste regel <plate type="source" name="Corning_1536COC_HiBase" barcode="U001687" />,
maar het lukt niet om van de tweede regel <plate type="destination" name="Corning1536" barcode="13LAMT002045A" /> de gegevens in een variabele te krijgen.

Alle hulp is welkom
 
Je kunt ook met je huidige methode een group selecteren en dan eerste en de volgende node inlezen
 
Ben niet thuis in XML Reader methods,

maar HOE kan ik "met huidige methode een group selecteren en dan eerste en de volgende node inlezen "

hoe kan ik een groep selecteren en de verschillende nodes inlezen? Hoe zie een code voorbeeld hiervan eruit?

Krijg wel de data uit de eerste regel
 
Ben niet thuis in XML Reader methods

DE kans om het te leren zou ik zeggen. Op de pagina waar ik naar verwees staat het duidelijk uitgelegd.
 
voor de oplossing met document:
Code:
Sub x()
    Dim xmldoc As DOMDocument60
    Dim mijnset As IXMLDOMNodeList
    Set xmldoc = New DOMDocument60
    
    xmldoc.Load ("y:\test.xml")
    Set mijnset = xmldoc.SelectNodes("//transfer/plateInfo/*")
    For Each inset In mijnset
        MsgBox (inset.Attributes.getNamedItem("type").Text)
    Next inset
    
End Sub
 
Dank je wel, dit werkt prima.

Heb het zelf proberen aan te passen voor andere velden zodat ik ook uit ander velden kon lezen maar dat lukte niet.
Ik probeer het te begrijpen

Als er meer niveaus onderzitten dan moet formule anders worden
in mijnset wordt een path gedefenieerd (transfer-plateinfo) en mijnset is een NODELIST
en inset is een variabele , maar geen NODE??

wordt het hoogste niveau "transfer"een NODE genoemd en een niveau lager "plateinfo" ook,
maar wat hieronder komt heet weer Attribute?
 
inset is wel een node. het is een node uit nodelist.

een node is een "element". in dit geval het element "plate". Plate heeft de "attributes" type,name en barcode.

In "nette" xml zou het beter om het op te schrijven als elements en niet attributes:

attribute notatie:

[xml]<plate type="source" name="Corning_1536COC_HiBase" barcode="U001687" />[/xml]

element notatie:
[xml]
<plate>
<type>source</type>
<name>Corning_1536COC_HiBase</name>
<barcode>U001687</barcode>
</plate>
[/xml]
 
Probeer nu de code zo aan te passen dat ik uit eerste NODE "transfer"de attributes "style"en "date" eruit kan halen.
heb hiervoor de code als volgt aangepast :
Set mijnset = xmldoc.SelectNodes("//*"), hier dus het path aangepast en laat resultaat in cell van excel sheet wegschrijven.


Code:
Sub xml_read_other_Node()
Dim xmldoc As DOMDocument60
Dim mijnset As IXMLDOMNodeList

Set xmldoc = New DOMDocument60

xmldoc.Load ("C:\transfer.xml")

Set mijnset = xmldoc.SelectNodes("//*")
rij = 4
kol = 2

For Each inset In mijnset
Cells(rij, kol) = inset.Attributes.getNamedItem("style").Text
Cells(rij, kol + 1) = inset.Attributes.getNamedItem("date").Text
'MsgBox (inset.Attributes.getNamedItem("type").Text)
rij = rij + 1
Next inset
End Sub

Maar krijg onderstaande foutcode

Objectvariabele of blokvariabele With is niet ingesteld

Wat doe ik niet goed?
 
heb je al geprobeerd ?

Code:
Sub M_snb()
    ActiveWorkbook.XmlImport "http://gd2.mlb.com/components/game/mlb/year_2012/month_04/day_05/miniscoreboard.xml", Nothing, True, Sheets(1).Cells(1)
End Sub
 
Even afgezien van de fout in de code, is inderdaad de toepassingen belangrijk.

In het geval van een enkele node kun je wel selectsinglenode gebruiken. Voor een groep gebruik je de groep functie. verder kun je ook lineair door de xml lopen, node voor node. Wat je nodig hebt en gebruikt is dus afhankelijk van je situatie, hoe de XML geformatteerd is en wat je weet van de structuur.
 
Dus het hoogste nivea van de xml ( in dit geval "Transfer"is dus geen NODE

Wil dus van het hoogste niveau "transfer"de waarden van de attributes "style" en "date" uitlezen.
Het uitlezen van een lager niveau bv "plate", lukt nu dus met eerder aangegevn code van u.

Zou u mij voor het uitlezen van het niveau "transfer" ook kunnen helpen.

Code:
<?xml version="1.0" ?> 
<transfer style="startstop" date="2013-08-26" serial_number="E5XX-0909">
<plateInfo>
  <plate type="source" name="15_Hibase" barcode="U001687" /> 
  <plate type="destination" name="Corning36" barcode="13LAMT002045A" /> 
  </plateInfo>
<dmsocoefficients>
	<velocityvsdmso n="1" v="-6.457"/>
	<velocityvsdmso n="2" v="2135"/>
	<dmsocliplow v="70"/>
	<dmsocliphigh v="100"/>
</dmsocoefficients>
<platemap>
	<fluidcompositionmethod v="PlateSignature"/>
	<fluidcompositionmin v="88.222"/>
	<composition cols="3" rows="3">
		<w c="0" r="0" n="A1" com="99.511"/>
		<w c="1" r="0" n="A2" com="97.293"/>
		<w c="2" r="0" n="A3" com="98.133"/>
	</composition>
</platemap>
</transfer>
 
jawel, maar is geen group
Code:
xmlDoc.SelectSingleNode("/*")

Het is echter ook de "root" node en kan dus ook zo aangesproken worden
Code:
xmlDoc.DocumentElement

XML is gemaakt om data te structureren. Hoe je het beste data aanspreekt is echter aan de gebruiker
 
Dit bespaart je een hoop werk:

Activeer de referentie naar Microsoft ActiveX Data Objects 2.0 Library
Pas het pad en de bestandsnaam G:\OF\test.xml aan.
Pas zonodig de naam van het werkblad Blad1 aan:

Code:
Sub M_snb()
    '   activeer de referentie naar Microsoft ActiveX Data Objects 2.0 Library

    ThisWorkbook.XmlImport "G:\OF\test.xml", Nothing, True, Blad1.Cells(1)
    
    With New Recordset
      .Open "SELECT [style],[date],[type] FROM `Blad1$`;", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & ThisWorkbook.FullName & "';Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
      Sheets("Blad1").Cells(20, 1).CopyFromRecordset .DataSource
    End With
End Sub
 
Hallo snb,

heb deze andere manier gebruikt en aangepast naar mijn situatie. Heb ook de referentie geactiveerd.
De gegevens worden inderdaad opgehaald naar Excel zoals dat normaal met een XML import naar Excel gebeurd.
Krijg alleen de volgende foutmelding
De indeling van de initialisatietekenreeks voldoet niet aan de OLE DB-specificatie.
 
Hallo Wampier,

Heb eerste onderstaande commando gebruikt en werkt prima, maar tweede manier met DocumentElement geeft een error.
xmlDoc.SelectSingleNode("/*")


Tweede commande, werkt niet geeft foutmelding
"Het is echter ook de "root" node en kan dus ook zo aangesproken worden"
xmlDoc.DocumentElement

heb de Dim aangepast van 'Dim mijnset As IXMLDOMNodeList naar Dim mijnset As IXMLDOMElement
maar geeft foutmelding op regel
"For Each inset In mijnset"
Deze eigenschap of methode wordt niet ondersteund door object
 
Het bestand waarin je de XML gegevens importeert moet al wel zijn opgeslagen (Pad +naam) voordat je de macro kun uitvoeren.
Anders heeft Thisworkbook.fullname geen waarde.
 
snb,

de file waar de data in moest komen is een bestaande file.

De waarden uit de xml file worden netjes ingelezen in de geopende workbook, maar daarna komt deze error message, dus
 
Kun je de code plaatsen die je gebruikt ?
 
Dit is de code
Code:
Sub M_snb()
    '   activeer de referentie naar Microsoft ActiveX Data Objects 2.0 Library

    ThisWorkbook.XmlImport "C:\Users\Ron\Documents\2013\Data\Software\Excel_Macro's\XML\transfer.xml", Nothing, True, Blad1.Cells(1)
    
    With New Recordset
      .Open "SELECT [style],[date],[type] FROM `Blad1$`;", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & ThisWorkbook.FullName & "';Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
      Sheets("Blad1").Cells(20, 1).CopyFromRecordset .DataSource
    End With
End Sub

Dit is naam van Excelfile die geopend is en waar deze macro instaat : C:\Users\Ron\Documents\2013\Data\Software\Excel_Macro's\XML\testmap_XML.xlsm
Dit is de foutmelding en de ingeladen data in Excel
excel_ingeladen_data.PNGFoutmelding.PNG
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan