uglyguy
Goto Top

XML Dateien in Excel einlesen per VBA

Hallo Experten,
ich habe viele xml Dateien die einen identischen Aufbau besitzen. Ich möchte gerne die xml files (evtl mit Filter) aus einem spezifizierbaren Verzeichnis in eine(!) Excel Tabelle einlesen
Dabei soll jede Datei die Daten in eine neue Zeile der Tabelle schreiben. Super wäre wenn ich in den files spezifizieren könnte welche Daten in die Tabelle geschrieben werden.

So sehen die xml files aus (Auszug):

-<MeasControl>

-<Level1>
<TempCompensationNominal>74.6580</TempCompensationNominal>
<TempCompensationCalibration>74.6614</TempCompensationCalibration>
<TempCompensationAmountTempCompensation>-0.0034</TempCompensationAmountTempCompensation>
<MeasureNominal>26.7200</MeasureNominal>
<MeasureMeas1>26.9178</MeasureMeas1>
<MeasureMeas2>26.9250</MeasureMeas2>
<MeasureMean>26.9214</MeasureMean>
<MeasureDifference>0.0036</MeasureDifference>
<MeasureInfeed>-0.1007</MeasureInfeed>
<CorrectionLastStroke>-0.0007</CorrectionLastStroke>
</Level1>

-<Level2>
<TempCompensationNominal>74.6580</TempCompensationNominal>
<TempCompensationCalibration>74.6610</TempCompensationCalibration>
<TempCompensationAmountTempCompensation>-0.0030</TempCompensationAmountTempCompensation>
<MeasureNominal>26.5680</MeasureNominal>
<MeasureMeas1>26.6164</MeasureMeas1>
<MeasureMeas2>26.6212</MeasureMeas2>
<MeasureMean>26.6188</MeasureMean>
<MeasureDifference>0.0024</MeasureDifference>
<MeasureInfeed>-0.0254</MeasureInfeed>
<CorrectionLastStroke>-0.0004</CorrectionLastStroke>
</Level2>

<MeasureDisplacementStartPos>0</MeasureDisplacementStartPos>

</MeasControl>


Ich möchte jetzt bspw. aus 20 xml files jeweils die Daten <Level1><TempCompensationAmountTempCompensation> und <Level2><TempCompensationAmountTempCompensation>

Ich bin jetzt leider kein VB Profi und konnte mir somit auch mit diesem Thema:
Einlesen bestimmten Werten, Texten aus XML- Datei in EXCEL
nicht behelfen!

Besten Dank im Voraus

Content-ID: 630136

Url: https://administrator.de/contentid/630136

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

146707
146707 10.12.2020 aktualisiert um 15:07:19 Uhr
Goto Top
VBA ist doch sowas von altbacken und bringt in Zukunft nur Probleme mit sich, sowas macht man heute gleich schnell mit der Powershell, für die wäre das ein Einzeiler (Variablendeklaration jetzt zur Übersicht mal ausgenommen)
$folder = 'D:\uglyguy\*.xml'  
$output = 'D:\uglyguy\data.csv'  
Select-Xml -Path $folder -XPath '/MeasControl' | select Path,@{n='Level1';e={$_.Node.Level1.TempCompensationAmountTempCompensation}},@{n='Level2';e={$_.Node.Level2.TempCompensationAmountTempCompensation}} | export-csv $output -Delimiter ";" -NoType -Encoding UTF8  
Ich bin jetzt leider kein VB Profi
Dann fang auch besser gar nicht mehr damit an face-wink.
uglyguy
uglyguy 10.12.2020 um 16:33:37 Uhr
Goto Top
Hallo primal,
vielen Dank für die superschnelle Antwort. Habe jetzt nur anscheinend ein Problem da ich nicht das ganze xml-file hier gepostet habe und jetzt das ansprechen der entsprechenden Daten fehlschlägt. Wenn ich im xml file alles bis auf die section /MeasControl lösche funktioniert es.
Kann man das noch "hinbiegen"?

Hier das komplette File (sorry für die Länge):
-<Root>

<SerialNo> </SerialNo>

<ProjectName>V75 FEMALE</ProjectName>

<DateTime>20.11.2020 09:49:07</DateTime>

<MachineNo>2249</MachineNo>


-<GrindingTechnology>


-<Tool1>

<CuttingSpeed>85</CuttingSpeed>

<DirectionOfRotation>Right</DirectionOfRotation>

<AmaountOfOil>100</AmaountOfOil>

<GrindingCurrentLimit>1</GrindingCurrentLimit>

<CoolDownRotations>0</CoolDownRotations>

<MeasuringPosition1>24.236</MeasuringPosition1>

<MeasuringPosition2>96.944</MeasuringPosition2>

<MeasuringDiameter>RootCircle</MeasuringDiameter>

<MeasuringIntervall>1</MeasuringIntervall>

<ScratchingPosition>114.566</ScratchingPosition>


-<Stroke1>

<StrokeDirektion>Negative</StrokeDirektion>

<InfeedRadial>0.681</InfeedRadial>

<InfeedGrad>0</InfeedGrad>

<Feed>1800</Feed>

<Indexing>No</Indexing>

<Modifications>No</Modifications>

<AdaptivControlLL>40</AdaptivControlLL>

<AdaptivControlUL>50</AdaptivControlUL>

<AdaptivControlStep>5</AdaptivControlStep>

</Stroke1>


-<Stroke2>

<StrokeDirektion>Positive</StrokeDirektion>

<InfeedRadial>0.3</InfeedRadial>

<InfeedGrad>0</InfeedGrad>

<Feed>2000</Feed>

<Indexing>Crossover</Indexing>

<Modifications>No</Modifications>

<AdaptivControlLL>40</AdaptivControlLL>

<AdaptivControlUL>50</AdaptivControlUL>

<AdaptivControlStep>5</AdaptivControlStep>

</Stroke2>


-<Stroke3>

<StrokeDirektion>Negative</StrokeDirektion>

<InfeedRadial>0.2</InfeedRadial>

<InfeedGrad>0</InfeedGrad>

<Feed>2000</Feed>

<Indexing>No</Indexing>

<Modifications>No</Modifications>

<AdaptivControlLL>40</AdaptivControlLL>

<AdaptivControlUL>50</AdaptivControlUL>

<AdaptivControlStep>5</AdaptivControlStep>

</Stroke3>


-<Stroke4>

<StrokeDirektion>Positive</StrokeDirektion>

<InfeedRadial>0.1</InfeedRadial>

<InfeedGrad>0</InfeedGrad>

<Feed>2000</Feed>

<Indexing>Crossover</Indexing>

<Modifications>No</Modifications>

<AdaptivControlLL>40</AdaptivControlLL>

<AdaptivControlUL>50</AdaptivControlUL>

<AdaptivControlStep>5</AdaptivControlStep>

</Stroke4>

</Tool1>


-<Tool2>

<CuttingSpeed>70</CuttingSpeed>

<DirectionOfRotation>Right</DirectionOfRotation>

<AmaountOfOil>100</AmaountOfOil>

<GrindingCurrentLimit>1</GrindingCurrentLimit>

<CoolDownRotations>0</CoolDownRotations>

<AdaptivControl>False</AdaptivControl>

<MeasuringPosition1>24.236</MeasuringPosition1>

<MeasuringPosition2>96.944</MeasuringPosition2>

<MeasuringDiameter>RootCircle</MeasuringDiameter>

<MeasuringIntervall>1</MeasuringIntervall>

<OffsetAngle>-0.03</OffsetAngle>

<ShiftAngle>-0.024</ShiftAngle>


-<Stroke1>

<StrokeDirektion>Negative</StrokeDirektion>

<InfeedRadial>0.045</InfeedRadial>

<InfeedGrad>0</InfeedGrad>

<Feed>2000</Feed>

<Indexing>No</Indexing>

<Modifications>No</Modifications>

</Stroke1>


-<Stroke2>

<StrokeDirektion>Positive</StrokeDirektion>

<InfeedRadial>0.025</InfeedRadial>

<InfeedGrad>0</InfeedGrad>

<Feed>2000</Feed>

<Indexing>Discontinuous</Indexing>

<Modifications>No</Modifications>

</Stroke2>


-<Stroke3>

<StrokeDirektion>Negative</StrokeDirektion>

<InfeedRadial>0</InfeedRadial>

<InfeedGrad>0</InfeedGrad>

<Feed>2000</Feed>

<Indexing>Discontinuous</Indexing>

<Modifications>No</Modifications>

</Stroke3>

</Tool2>

</GrindingTechnology>


-<Times>

<StartTime>09:49:05</StartTime>

<LastCycleTimeSeconds>127.048</LastCycleTimeSeconds>

</Times>


-<GrindingSequenz>

<Alignment>False</Alignment>

<Roughing>False</Roughing>

<Semi>False</Semi>

<Finishing>True</Finishing>

</GrindingSequenz>


-<MeasControl>


-<Level1>

<TempCompensationNominal>74.6580</TempCompensationNominal>

<TempCompensationCalibration>0.0000</TempCompensationCalibration>

<TempCompensationAmountTempCompensation>0.0000</TempCompensationAmountTempCompensation>

<MeasureNominal>0.0000</MeasureNominal>

<MeasureMeas1>0.0000</MeasureMeas1>

<MeasureMeas2>0.0000</MeasureMeas2>

<MeasureMean>0.0000</MeasureMean>

<MeasureDifference>0.0000</MeasureDifference>

<MeasureInfeed>0.0000</MeasureInfeed>

<CorrectionLastStroke>0.0000</CorrectionLastStroke>

</Level1>


-<Level2>

<TempCompensationNominal>74.6580</TempCompensationNominal>

<TempCompensationCalibration>74.6583</TempCompensationCalibration>

<TempCompensationAmountTempCompensation>-0.0003</TempCompensationAmountTempCompensation>

<MeasureNominal>26.5320</MeasureNominal>

<MeasureMeas1>26.5844</MeasureMeas1>

<MeasureMeas2>26.5888</MeasureMeas2>

<MeasureMean>26.5866</MeasureMean>

<MeasureDifference>0.0022</MeasureDifference>

<MeasureInfeed>-0.0273</MeasureInfeed>

<CorrectionLastStroke>-0.0023</CorrectionLastStroke>

</Level2>

<MeasureDisplacementStartPos>0</MeasureDisplacementStartPos>

</MeasControl>


-<Runout>

<RunoutLimit>0.0080</RunoutLimit>

<Min>-0.0045</Min>

<Max>0.0017</Max>

<Avg>0.0000</Avg>

<Runout>0.0062</Runout>

</Runout>


-<Adaptive_control>


-<Tool1>

<MaxFeedrateReduction>0</MaxFeedrateReduction>

<MaxFeedrateReductionStroke>0</MaxFeedrateReductionStroke>

<MaxGrindingCurrent>0</MaxGrindingCurrent>

</Tool1>


-<Tool2>

<MaxFeedrateReduction>0</MaxFeedrateReduction>

<MaxFeedrateReductionStroke>0</MaxFeedrateReductionStroke>

<MaxGrindingCurrent>14.91</MaxGrindingCurrent>

</Tool2>

<Feedrate>100</Feedrate>

</Adaptive_control>


-<OverrideMachineControlPanel>

<StartProcessing>100</StartProcessing>

<EndRoughing>0</EndRoughing>

<EndFinishing>100</EndFinishing>

</OverrideMachineControlPanel>


-<Corrections>


-<Tool1>

<RadialGrindingPos>0.0530</RadialGrindingPos>

<Nominal>0.0210</Nominal>

<Conicity>0.0090</Conicity>

<TangentialGrindingPos>0.0000</TangentialGrindingPos>

<AxialGrindingPos>0.0000</AxialGrindingPos>

<ToolSwivelAxis>0.0000</ToolSwivelAxis>

</Tool1>


-<Tool2>

<RadialGrindingPos>0.0350</RadialGrindingPos>

<Nominal>0.0040</Nominal>

<Conicity>0.0090</Conicity>

<TangentialGrindingPos>0.0000</TangentialGrindingPos>

<AxialGrindingPos>0.0000</AxialGrindingPos>

<ToolSwivelAxis>0.0000</ToolSwivelAxis>

</Tool2>


-<AllTools>

<Lead>-0.0100</Lead>

<TangentialGrindingPos>0.0000</TangentialGrindingPos>

<StockDivisionDegree>-0.3090</StockDivisionDegree>

<StockDivisionMM>-0.1498</StockDivisionMM>

</AllTools>

</Corrections>


-<TemperaturesAndOil>

<AmbientTemperature>0.0</AmbientTemperature>

<OilTemperature>0.0</OilTemperature>

<OilQuantityPump1>0</OilQuantityPump1>

<OilQuantityPump2>0</OilQuantityPump2>

</TemperaturesAndOil>


-<MonitoringTailstock>

<ActualValueAfterRootMeasurementTool2>0.0000</ActualValueAfterRootMeasurementTool2>

<ActualValueAfterLastStrokeOfTool2>0.0000</ActualValueAfterLastStrokeOfTool2>

</MonitoringTailstock>

</Root>
146707
Lösung 146707 10.12.2020 aktualisiert um 16:42:14 Uhr
Goto Top
Jepp, brauchst du nur den Xpath auf '/Root/MeasControl' anpassen ... face-wink
$folder = 'D:\uglyguy\*.xml'  
$output = 'D:\uglyguy\data.csv'  
Select-Xml -Path $folder -XPath '/Root/MeasControl' | select Path,@{n='Level1';e={$_.Node.Level1.TempCompensationAmountTempCompensation}},@{n='Level2';e={$_.Node.Level2.TempCompensationAmountTempCompensation}} | export-csv $output -Delimiter ";" -NoType -Encoding UTF8  

p.s. für die Zukunft bitte Codetags (siehe Symbolleiste das "</>") für Quellcodes benutzen. Danke!
uglyguy
uglyguy 10.12.2020 um 16:48:02 Uhr
Goto Top
Genial! Vielen Dank!
uglyguy
uglyguy 10.12.2020 um 17:06:07 Uhr
Goto Top
Oh mann - irgendwie hänge ich schon wieder...
Wie muss es denn aussehen wenn ich bspw in <Level1> noch einen Wert dazunehmen will wie <MeasureInfeed>?
146707
146707 10.12.2020 aktualisiert um 17:10:39 Uhr
Goto Top
Gleiches Schema wie oben schau es dir doch einfach ab ...
# ....
Select-Xml -Path $folder -XPath '/Root/MeasControl' | select Path,@{n='TempCompensation_Level1';e={$_.Node.Level1.TempCompensationAmountTempCompensation}},@{n='TempCompensation_Level2';e={$_.Node.Level2.TempCompensationAmountTempCompensation}}, @{n='MeasureInfeed_Level1';e={$_.Node.Level1.MeasureInfeed}},@{n='MeasureInfeed_Level2';e={$_.Node.Level2.MeasureInfeed}} | export-csv $output -Delimiter ";" -NoType -Encoding UTF8  
uglyguy
uglyguy 10.12.2020 um 17:16:59 Uhr
Goto Top
Ja sorry irgendwie stehe ich da auf dem Schlauch - aber das ist mir jetzt klar.
Kann man das eigentlich irgendwo nachlesen wie man die einzelnen sections in einem xml file ansteuert?
146707
146707 10.12.2020 aktualisiert um 17:21:43 Uhr
Goto Top
Kann man das eigentlich irgendwo nachlesen wie man die einzelnen sections in einem xml file ansteuert?
Kannst du, die Selektionssprache nennt sich XPath
https://www.w3schools.com/xml/xpath_syntax.asp