kaiuwe28
Goto Top

XML Datei auslesen mit Excel

Hallo zusammen,

ich mal wieder...

Leider komme ich nicht weiter. Ich möchte aus einem Ordner mit mehreren XML Dateien alle Dateien auf bestimmte Werte durchsuchen und diese in einer Tabelle aufführen um daraus später eine Statistik zu erstellen.

Das Einlesen aller Dateien funktioniert, jedoch sind am Ende die Spalten nicht identisch, obwohl der Aufbau der XML aus meiner Sicht identisch ist.
Meine erste Idee war alles Einlesen und dann Bereinigen, das klappt jetzt aber nicht mehr wegen den unterschiedlichen Spalten.

Google hat mir einiges an Infos zum Auslesen von Knoten gebracht, aber aktuell steige ich da nicht hinter, wie das mit den Knoten in den XML Dateien funktioniert.

Folgendes Script lädt alle XML Dateien ein:

Sub ImportXML()
    Const XMLPATH = "C:\Users\kaiuwe28\Downloads\Test_xml"  
    Dim f As Object, c As Object
    Set fso = CreateObject("Scripting.Filesystemobject")  
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    With Sheets("Import")  
        For Each f In fso.GetFolder(XMLPATH).Files
            If LCase(fso.GetExtensionName(f.Name)) = "xml" Then  
                ActiveWorkbook.XmlImport URL:=f.Path, ImportMap:=Nothing, Overwrite:=True, Destination:=.Range("A" & .UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1)  
                ActiveWorkbook.Connections(ActiveWorkbook.Connections.Count).Delete
            End If
        Next
    End With

    Set fso = Nothing
    
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    
    MsgBox "Importvorgang beendet!", vbInformation  
    
End Sub


Die XML Datei ist wie folgt aufgebaut (hab mehrere verglichen) bzw. sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>  

-<Document xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02 camt.054.001.02.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02">  


-<BkToCstmrDbtCdtNtfctn>


-<GrpHdr>

<MsgId>QM111111L1111111</MsgId>

<CreDtTm>2017-11-08T21:55:14</CreDtTm>


-<MsgRcpt>


-<Id>


-<OrgId>


-<Othr>

<Id>XA111111</Id>

<Issr>EBICS</Issr>

</Othr>

</OrgId>

</Id>

</MsgRcpt>


-<MsgPgntn>

<PgNb>1</PgNb>

<LastPgInd>true</LastPgInd>

</MsgPgntn>

</GrpHdr>


-<Ntfctn>

<Id>QM111111L1111111</Id>

<CreDtTm>2017-11-08T21:53:37</CreDtTm>


-<Acct>


-<Id>

<IBAN>DE11111111111111111111</IBAN>

</Id>


-<Tp>

<cd>CACC</cd>

</Tp>

<Ccy>EUR</Ccy>


-<Ownr>

<Nm>Germany GmbH + Co</Nm>

</Ownr>


-<Svcr>


-<FinInstnId>

<BIC>COBADEFFXXX</BIC>

<Nm>Commerzbank AG</Nm>


-<PstlAdr>

<AdrTp>ADDR</AdrTp>

<PstCd>60311</PstCd>

<TwnNm>Frankfurt am Main</TwnNm>

<Ctry>DE</Ctry>

</PstlAdr>


-<Othr>

<Id>DE111111111</Id>

<Issr>UmsStId</Issr>

</Othr>

</FinInstnId>

</Svcr>

</Acct>


-<Ntry>

<Amt Ccy="EUR">1111.11</Amt>  

<CdtDbtInd>DBIT</CdtDbtInd>

<Sts>BOOK</Sts>


-<BookgDt>

<Dt>2017-11-08</Dt>

</BookgDt>


-<ValDt>

<Dt>2017-11-08</Dt>

</ValDt>

<AcctSvcrRef>QM111111L1111111</AcctSvcrRef>


-<BkTxCd>


-<Domn>

<cd>PMNT</cd>


-<Fmly>

<cd>RDDT</cd>

<SubFmlyCd>ESDD</SubFmlyCd>

</Fmly>

</Domn>


-<Prtry>

<cd>195</cd>

<Issr>DK</Issr>

</Prtry>

</BkTxCd>


-<NtryDtls>


-<Btch>

<NbOfTxs>000000040</NbOfTxs>

<TtlAmt Ccy="EUR">1111.11</TtlAmt>  

<CdtDbtInd>DBIT</CdtDbtInd>

</Btch>


-<TxDtls>


-<Refs>

<AcctSvcrRef>H1111111I11111111111</AcctSvcrRef>

<InstrId>CB20171101IX111111C0111111000000111</InstrId>

<EndToEndId>T000011111</EndToEndId>

<TxId>CB20171030FAIX111111C01111110000111</TxId>

<MndtId>BBBB10000101111010101101</MndtId>

</Refs>


-<AmtDtls>


-<InstdAmt>

<Amt Ccy="EUR">11.10</Amt>  

</InstdAmt>


-<TxAmt>

<Amt Ccy="EUR">11.11</Amt>  

</TxAmt>

</AmtDtls>


-<BkTxCd>


-<Domn>

<cd>PMNT</cd>


-<Fmly>

<cd>IDDT</cd>

<SubFmlyCd>UPDD</SubFmlyCd>

</Fmly>

</Domn>


-<Prtry>

<cd>NDDT+109+97186</cd>

<Issr>DK</Issr>

</Prtry>

</BkTxCd>


-<Chrgs>

<Amt Ccy="EUR">3.00</Amt>  

<CdtDbtInd>DBIT</CdtDbtInd>


-<Tp>


-<Prtry>

<Id>GEBUEHR FREMD</Id>

</Prtry>

</Tp>

<Br>SLEV</Br>

</Chrgs>


-<RltdPties>


-<Dbtr>

<Nm>Max Mustermann</Nm>

</Dbtr>


-<DbtrAcct>


-<Id>

<IBAN>DE22200222220002220222</IBAN>

</Id>

</DbtrAcct>


-<Cdtr>

<Nm>Germany GmbH + Co. OHG</Nm>


-<Id>


-<PrvtId>


-<Othr>

<Id>DE3300000000333333</Id>


-<SchmeNm>

<Prtry>SEPA</Prtry>

</SchmeNm>

</Othr>

</PrvtId>

</Id>

</Cdtr>


-<CdtrAcct>


-<Id>

<IBAN>DE111111111111111111</IBAN>

</Id>

</CdtrAcct>

</RltdPties>


-<RltdAgts>


-<DbtrAgt>


-<FinInstnId>

<BIC>GENODEF1DS1</BIC>

</FinInstnId>

</DbtrAgt>


-<CdtrAgt>


-<FinInstnId>

<BIC>COBADEFFXXX</BIC>

</FinInstnId>

</CdtrAgt>

</RltdAgts>


-<RmtInf>

<Ustrd>ORIGINALBETRAG 11,11 EUR ENTGELT FREMD 3,00 EIGEN 0,00 T000011111, 100111111, 1000010111, Germany sagt danke</Ustrd>

</RmtInf>


-<RltdDts>


-<Prtry>

<Tp>SIGNATURE DATE</Tp>


-<Dt>

<Dt>2016-10-12</Dt>

</Dt>

</Prtry>

</RltdDts>


-<RtrInf>


-<Orgtr>


-<Id>


-<OrgId>

<BICOrBEI>GENODEF1DS1</BICOrBEI>

</OrgId>

</Id>

</Orgtr>


-<Rsn>

<cd>MS03</cd>

</Rsn>

<AddtlInf>Return/Refund Auf Veranlassung der Bank RCUR</AddtlInf>

</RtrInf>

</TxDtls>


Kann mir einer sagen, wie ich einen Knoten bzw. Unterknoten abfrage?

Ich bräuchte z:B. folgende Werte:

InstdAmt, TxAmt, AmtCcy, Rsn und so weiter...


Edit:
Evtl. kann mir ja auch einer sagen, wie ich den Dateinamen in Spalte A bekomme.

Damit der Rest erst in Spalte B anfängt muss ich ja nur Destination:=.Range("A" auf Destination:=.Range("B" ändern.
Bekomme den f.Name aber leider nicht in Spalte A.


Vielen Dank schon einmal für Antworten face-smile

Content-ID: 354644

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

Ausgedruckt am: 16.11.2024 um 19:11 Uhr

Volchy
Volchy 14.11.2017 um 07:37:04 Uhr
Goto Top
Moin kaiuwe28,

schau dir mal den älteren Beitrag hier im Forum an.

LG
Volchy
Pedant
Pedant 14.11.2017 um 09:40:18 Uhr
Goto Top
Hallo kaiuwe28,

Das Einlesen aller Dateien funktioniert, jedoch sind am Ende die Spalten nicht identisch, obwohl der Aufbau der XML aus meiner Sicht identisch ist.

Ich habe mir Deine XML kopiert, um auszuprobieren, ob ich Deine Problemstellung nachvollziehen kann und vielleicht eine Lösung finde.

Das Ausprobieren scheiterte daran, dass Deine XLM syntaktisch fehlerhaft ist.

Folgende Tags werden geöffnet, aber nie geschlossen:
Zeile 3   : -<Document...
Zeile 6   : -<BkToCstmrDbtCdtNtfctn>
Zeile 51  : -<Ntfctn>
Zeile 122 : -<Ntry>
Zeile 177 : -<NtryDtls>

Ich habe die fehlenden </tags> nach Gutdünken hinzugefügt, aber beim Öffnen im Excel kam dabei nicht Schickes heraus.
Wieviele Datensätze, mit wievielen Datenfelder (Zeilen und Spalten) sollte Deine XLM eigentlich enthalten?

Da XLM und ich noch keine Freunde sind, zwei Fragen:
Muss auch <Document...> mit </Document> geschlossen werden oder gilt das als "Überschrift"?
Ist das Minus vor den öffnenden Tags (-<tag>) zulässig? (Firefox findet das doof.)

Gruß Frank
kaiuwe28
kaiuwe28 14.11.2017 um 10:20:55 Uhr
Goto Top
Guten Morgen Volchy,

auf diesen Beitrag bin ich schon gestoßen, aber noch nicht schlau geworden.
Werde mich damit mal etwas länger auseinandersetzen und wenn ich was hinbekomme, dann hau ich es hier rein.

Danke face-smile
kaiuwe28
kaiuwe28 14.11.2017 aktualisiert um 10:38:23 Uhr
Goto Top
Guten Morgen Frank,

es handelt sich täglich um 25 bis 40 XML Dateien, welche per Batch in 2 Ordner aufgeteilt werden.
Pro Ordner haben die XML Dateien die gleiche Struktur, da vom selben Ersteller. Die Spalten sind in Excel jedoch unterschiedlich. Pro Datei gibt es 1 bis 40.000 Datensätze. Ein Datensatz hat auch mal 3 Zeilen. Ich hoffe, dass ich es korrekt beschrieben habe.

Ich habe die XML Infos aus dem Office XML Handler kopiert und bis zur ersten Wiederholung kopiert. Aus Excel bekomme ich die Struktur nicht kopiert oder exportiert. Gibt es hier einen Weg, da das auch viel übersichtlicher aussieht, als über den Office XML Handler.

Die Minus Striche macht der Office XML Handler und hier kann ich dann die Unterpunkte minimieren.

Leider kann ich die Frage zum Thema Document nicht beantworten. Ich bin aktuell auch kein Freund von XML und mit VBA bin ich auch relativ weit am Anfang. Irgendwie bei mir wie mit Englisch... Verstehen und Lesen ist ok, aber beim Sprechen komme ich oft ins Schleudern.

Danke dir

Jens
Pedant
Pedant 14.11.2017 um 10:39:48 Uhr
Goto Top
Hallo Jens,

Zitat von @kaiuwe28
Ich habe die XML Infos aus dem Office XML Handler kopiert und bis zur ersten Wiederholung kopiert.
Könntest Du eine vollständige XML posten oder wäre die zu groß oder zu indiskret?

Ich würde gerne wissen wie der "Feind" aussieht.

Zitat von @kaiuwe28
Die Minus Striche macht der Office XML Handler und hier kann ich dann die Unterpunkte minimieren.
In irgendeiner Ansicht oder sind die Striche tatsächlich in der Datei vorhanden (per notepad geöffnet)?

Gruß Frank
kaiuwe28
kaiuwe28 14.11.2017 um 11:16:23 Uhr
Goto Top
Könntest Du eine vollständige XML posten oder wäre die zu groß oder zu indiskret?
Ich würde gerne wissen wie der "Feind" aussieht.

Die Größe dürfte nicht da Problem sein, da die von 4KB bis 45000KB alles bei. Das Problem ist der Datenschutz. Alles Dateien beinhalten Kundeninformationen, welche ich ja am liebsten auslesen würde wollen.
Ich habe jetzt eine Datei mit einen Datensatz abgeändert mit Notepad ++ - evtl. hilft das ja.

Dateiaufbau

In irgendeiner Ansicht oder sind die Striche tatsächlich in der Datei vorhanden (per notepad geöffnet)?

Die Striche sind nur in der Ansicht vom Office XML Handler ersichtlich. Habe die mal im Notepad ++ und im Editor geöffnet, da sind diese nicht.

Ich muss mich auch korrigieren. Ich habe jetzt noch einmal 2 Dateien verglichen. Die Felder sind identisch, aber die Anordnung ist unterschiedlich.
Pedant
Pedant 14.11.2017 um 16:14:58 Uhr
Goto Top
Hallo Jens,

Zitat von @kaiuwe28
...2 Dateien verglichen. Die Felder sind identisch, aber die Anordnung ist unterschiedlich.

ob das der beste Ansatz ist, kann ich nicht sagen, aber ich würde mit C# einen speziell angepassten Parser schreiben.
Den kann man dann in einer Forschleife auf den Ordner mit den XML-Dateien loslassen.

Myxml2csv.exe Test.xml generiert dann eine Test.csv

Die CSV hat dann das gewünscht Format und der Parser könnte auch bekannte Ungereimtheiten anfangen.

Der Ansatz wäre, die XML zeilenweise einzulesen, auf Start- und Endtags zu prüfen, diese zu verwerfen und die erwünschten Werte dazwischen in ein String-Array einzusortieren. Ist ein Datensatz durch, dann den Arrayinhalt als neue Zeile an die Zieldaten anfügen und für den nächsten Datensatz weiterparsen, bis zum Dateiende.

Falls Dich das interessiert, könnte ich Dir auch ein paar Code-Schnipsel zukommen lassen.
Falls nicht, muss ich mich hier ausklinken, denn für Deinen ursprünglichen Ansatz fehlen mir die nötigen Kenntnisse.

Gruß Frank
kaiuwe28
kaiuwe28 14.11.2017 um 18:13:21 Uhr
Goto Top
Hi Frank,

schon einmal vielen Dank für deinen Ansatz.

ob das der beste Ansatz ist, kann ich nicht sagen, aber ich würde mit C# einen speziell angepassten Parser schreiben.
Den kann man dann in einer Forschleife auf den Ordner mit den XML-Dateien loslassen.

Myxml2csv.exe Test.xml generiert dann eine Test.csv

Die CSV hat dann das gewünscht Format und der Parser könnte auch bekannte Ungereimtheiten anfangen.

Der Ansatz wäre, die XML zeilenweise einzulesen, auf Start- und Endtags zu prüfen, diese zu verwerfen und die erwünschten Werte dazwischen in ein String-Array einzusortieren. Ist ein Datensatz durch, dann den Arrayinhalt als neue Zeile an die Zieldaten anfügen und für den nächsten Datensatz weiterparsen, bis zum Dateiende.

Falls Dich das interessiert, könnte ich Dir auch ein paar Code-Schnipsel zukommen lassen.
Falls nicht, muss ich mich hier ausklinken, denn für Deinen ursprünglichen Ansatz fehlen mir die nötigen Kenntnisse.

Interessiert bin ich da sicherlich, aber ich muss auch ehrlich zu mir sein. Ich habe keine Ahnung von C# und ich glaube, damit ich da mit Teilen auch nicht weiterkomme. Für mich denke ich ist es das beste weiter für VBA zu probieren.

Wenn ich richtig gelesen habe, dann kann ich da auch die Knoten bzw. Unterknoten abfragen, jedoch muss ich mir noch darüber klar werden, wie ich anfange und wie der generelle Aufbau sein muss. Da fehlen mir halt als Leihe die Erfahrungen, aber ich bin zuversichtlich.

Dir auf jeden Fall vielen Dank noch einmal Frank!
colinardo
colinardo 15.11.2017 aktualisiert um 14:29:55 Uhr
Goto Top
Servus kaiuwe,
du solltest dir zu aller erst mal den Aufbau des CAMT054 Formats anschauen, denn dies ist so geschachtelt das diverse Elemente mehrfach auftauchen können und Daten an unterschiedlichen Stellen stehen können, je nach Transaktionart.
https://www.hypovereinsbank.de/content/dam/hypovereinsbank/cib/pdf/ebank ...
Du musst also erst mal festlegen was ausgelesen werden soll.

Mit einem Powershell-Skript kannst du das ganze für einen ganzen Satz an XML-Dateien abfackeln.

Ich habe dir mal ein Gerüst gebaut, mit "sprechenden Eigenschaften" des CAMT054 Formats damit du die Eigenschaten einfacher auswählen kannst:
(Richtigkeit der Zuordnung ohne Gewähr und an dem o. verlinkten PDF orientiert!)
$folder = 'D:\daten'  

gci $folder -Filter *.xml -File | %{
    $iban = $_.Basename.Split("_")[2]  
    $xml = New-Object XML
    $xml.Load($_.Fullname)
    $ns = new-Object System.Xml.XmlNamespaceManager $xml.NameTable
    $ns.AddNamespace("ns",$xml.DocumentElement.NamespaceURI)  

    $groupheader = $xml.Document.BkToCstmrDbtCdtNtfctn.GrpHdr
    $notification = $xml.Document.BkToCstmrDbtCdtNtfctn.Ntfctn
    $entries = $xml.Document.BkToCstmrDbtCdtNtfctn.Ntfctn.Ntry
    $entrydetails = $xml.Document.BkToCstmrDbtCdtNtfctn.Ntfctn.Ntry.NtryDtls
    $transactiondetails = $xml.Document.BkToCstmrDbtCdtNtfctn.Ntfctn.Ntry.NtryDtls.TxDtls
    $charges = $xml.Document.BkToCstmrDbtCdtNtfctn.Ntfctn.Ntry.NtryDtls.TxDtls.Chrgs

    $message = @{
        MessageId = $groupheader.MsgId
        MessageCreationDateTime = $groupheader.CreDtTm
        MessageRecipientName = $groupheader.MsgRcpt.Name
        MessageRecipientPostalAddress = @($groupheader.MsgRcpt.PstlAdr.AdrLine) -join "`r`n"  
        MessagePageNumber = $groupheader.MsgPgntn.PgNb
        MessageLastPageIndicator = $groupheader.MsgPgntn.LastPgInd
        MessageAdditionalInfo = $groupheader.AddtlInf    
        Notification = @{
            NotificationId = $notification.Id
            NotificationElektronicSequenceNumber = $notification.ElctrncSeqNb
            NotificationCreationDateTime = $notification.CreDtTm
            AccountIdIBAN = $notification.Acct.Id.IBAN
            AccountIdOther = $notification.Id.Othr
            AccountCurrency = $notification.Acct.Ccy
            AccountName = $notification.Acct.Nm
            AccountOwnerName = $notification.Acct.Ownr.Name
            AccountOwnerPostalAddress = @($notification.Acct.Ownr.PstlAdr.AdrLine) -join "`r`n"  
            AccountServicerInstitutionIdBic = $notification.Acct.Svcr.FinInstnId.BIC
            AccountServicerInstitutionIdName = $notification.Acct.Svcr.FinInstnId.Nm
            AccountServicerInstitutionOtherId = $notification.Acct.Svcr.FinInstnId.Othr.Id
            AccountServicerInstitutionOtherIssuer = $notification.Acct.Svcr.FinInstnId.Othr.Issr
        }
        Entries = $(
            $entries | %{
                @{
                    EntryAmount = $_.Amt
                    EntryCreditDebitIndicator = $_.CdtDbtInd
                    EntryStatus = $_.Sts
                    EntryBookingDate = $_.BookgDt.Dt
                    EntryValueDate = $_.ValDt.Dt
                    EntryAccountServicerReference = $_.AcctSvcrRef
                    EntryAdditionalInformationIndicator = $_.AddtlInfInd
                    EntryMessageNameId = $_.MsgNmId
                    EntryMessageId = $_.MsgId
                    EntryAdditionalInformation = $_.AddtlNtryInf
                    EntryDetails = $(
                        $entrydetails | %{
                            @{
                                EntryDetailBatchMessageId = $_.Btch.MsgId
                                EntryDetailBatchPaymentInformationId = $_.Btch.PmtInfId
                                EntryDetailBatchNumberOfTransactions = $_.Btch.NbOfTxs
                                EntryDetailBatchTotalAmount = $_.Btch.TtlAmt
                                EntryDetailBatchCreditDebitIndicator = $_.Btch.CdtDbtInd
                                TransactionDetails = $(
                                    $transactiondetails | %{
                                        @{
                                            TransactionRefMessageId = $_.Refs.MsgId
                                            TransactionRefPaymentInformationId = $_.Refs.PmtInfId
                                            TransactionRefEndToEndId = $_.Refs.EndToEndId
                                            TransactionRefTransactionId = $_.Refs.TxId
                                            TransactionRefMandateId = $_.Refs.MndtId
                                            TransactionRefChequeNumber = $_.Refs.ChqNb
                                            TransactionRefClearingSystemReference = $_.Refs.ClrSysRef
                                            TransactionRefProprietaryType = $_.Refs.Prtry.TP
                                            TransactionRefProprietaryReference = $_.Refs.Prtry.Ref
                                            AmountDetailsInstructedAmount = $_.AmtDtls.InstdAmt.Amt
                                            AmountDetailsTransactionAmount = $_.AmtDtls.TxAmt.Amt
                                            AmountDetailsTransactionCounterValueAmount = $_.AmtDtls.TxAmt.CntrValAmt.Amt
                                            AmountDetailsTransactionCurrencyExchangeSourceCurrency = $_.AmtDtls.TxAmt.CntrValAmt.CcyXchg
                                            AmountDetailsTransactionCurrencyExchangeTargetCurrency = $_.AmtDtls.TxAmt.CntrValAmt.TrgtCcy
                                            AmountDetailsTransactionCurrencyExchangeUnitCurrency = $_.AmtDtls.TxAmt.CntrValAmt.UnitCcy
                                            AmountDetailsTransactionCurrencyExchangeRate = $_.AmtDtls.TxAmt.CntrValAmt.XchgRate
                                            AmountDetailsTransactionProprietaryAmountType = $_.AmtDtls.TxAmt.PrtryAmt.Tp
                                            AmountDetailsTransactionProprietaryAmount = $_.AmtDtls.TxAmt.PrtryAmt.Amt
                                            BankTransactionCodeProprietary = $_.BkTxCd.Prtry.Cd
                                            BankTransactionCodeIssuer = $_.BkTxCd.Prtry.Issr
                                            Charges = $(
                                                $charges | %{
                                                    @{
                                                        ChargeAmount = $_.Amt
                                                        ChargeTypeId = $_.Tp.Prtry.Id
                                                        ChargeBearer = $_.Br
                                                    }
                                                }
                                            )
                                            InterestAmount = $_.Intrst.Amt
                                            InterestCreditDebitIndicator = $_.Intrst.CdtDbtInd
                                            RelatedPartiesInitiatingPartyName = $_.RltdPties.InitgPty.Nm
                                            RelatedPartiesDebitorName = $_.RltdPties.Dbtr.Nm
                                            RelatedPartiesDebitorPostalAddressCountry = $_.RltdPties.Dbtr.PstlAdr.Ctry
                                            RelatedPartiesDebitorPostalAddress = @($_.RltdPties.Dbtr.PstlAdr.AdrLine) -join "`r`n"  
                                            RelatedPartiesDebitorOrgId = $_.RltdPties.Dbtr.Id.OrgId
                                            RelatedPartiesDebitorPrivateId = $_.RltdPties.Dbtr.Id.PrvtId
                                            RelatedPartiesDebitorAccountId = $_.RltdPties.DbtrAcct.id.IBAN
                                            RelatedPartiesDebitorAccountOtherId = $_.RltdPties.DbtrAcct.Id.Othr.Id
                                            RelatedPartiesUltimateDebitorName = $_.RltdPties.UltmDbtr.Nm
                                            RelatedPartiesUltimateDebitorOrgId = $_.RltdPties.UltmDbtr.Id.OrgId
                                            RelatedPartiesUltimateDebitorPrivateId = $_.RltdPties.UltmDbtr.Id.PrvtId
                                            RelatedPartiesCreditorName = $_.RltdPties.Cdtr.Nm
                                            RelatedPartiesCreditorPostalAddressCountry = $_.RltdPties.Cdtr.PstlAdr.Ctry
                                            RelatedPartiesCreditorPostalAddress = @($_.RltdPties.Cdtr.PstlAdr.AdrLine) -join "`r`n"  
                                            RelatedPartiesCreditorOrgId = $_.RltdPties.Cdtr.Id.OrgId
                                            RelatedPartiesCreditorPrivateId = $_.RltdPties.Cdtr.Id.PrvtId
                                            RelatedPartiesCreditorAccountId = $_.RltdPties.CdtrAcct.id.IBAN
                                            RelatedPartiesCreditorAccountOtherId = $_.RltdPties.CdtrAcct.Id.Othr.Id
                                            RelatedPartiesUltimateCreditorName = $_.RltdPties.UltmCdtr.Nm
                                            RelatedPartiesUltimateCreditorOrgId = $_.RltdPties.UltmCdtr.Id.OrgId
                                            RelatedPartiesUltimateCreditorPrivateId = $_.RltdPties.UltmCdtr.Id.PrvtId
                                            RelatedAgentsDebitorAgentInstitutionIdBIC = $_.RltdAgts.DbtrAgt.FinInstnId.BIC
                                            RelatedAgentsDebitorAgentInstitutionIdClearingSystemMemberId = $_.RltdAgts.DbtrAgt.FinInstnId.ClrSysMmbId.Mmbid
                                            RelatedAgentsDebitorAgentInstitutionName = $_.RltdAgts.DbtrAgt.FinInstnId.Nm
                                            RelatedAgentsCreditorAgentInstitutionIdBIC = $_.RltdAgts.CdtrAgt.FinInstnId.BIC
                                            RelatedAgentsCreditorAgentInstitutionIdClearingSystemMemberId = $_.RltdAgts.CdtrAgt.FinInstnId.ClrSysMmbId.Mmbid
                                            RelatedAgentsCreditorAgentInstitutionName = $_.RltdAgts.CdtrAgt.FinInstnId.Nm
                                            PurposeCode = $_.Purp.Cd
                                            PurposeProprietaryCode = $_.Purp.Prtry
                                            RemittanceInformationUnstructured = $_.RmtInf.Ustrd
                                            RemittanceInformationStructured = $_.RmtInf.Strd
                                            RelatedDatesProprietary = $_.RltdDts.Prtry
                                            RelatedDatesType = $_.RltdDts.Tp
                                            RelatedDatesDateTime = $_.RltdDts.Dt.DtTm
                                            ReturnInformationReasonCode = $_.RtrInf.Rsn.Cd
                                            ReturnInformationReasonProprietary = $_.RtrInf.Rsn.Prtry
                                            AdditionalInformation = $_.AddtlInf
                                            AdditionalTransactionInformation = $_.AddtlTxInf

                                        }
                                    }
                                )
                            }
                        }
                    )
                }
            }    
        )
    }
   $message
}
In der Variablen $message findet sich die Strukturierte Ablage der XML-Datei mit einfach abrufbaren Eigenschaften. Diese musst du nur noch wählen, in ein PSCustomObject packen und per Export-CSV in eine CSV exportieren.
Hierbei ist wie oben geschrieben zu beachten das bestimmmte Teile wie die Entry-Elemente mehrfach vorkommen können und somit Array's sind welche mit einer zusätzlichen Schleife durchlaufen werden müssen. Hier kommt es eben darauf an wie du es am Ende darstellen willst.

Bei Bedarf helfe ich dir gerne gegen entsprechende Aufwandsentschädigung.

Grüße Uwe
kaiuwe28
kaiuwe28 15.11.2017 um 14:36:50 Uhr
Goto Top
Hallo Uwe,

ich bin mal wieder fasziniert... wahrscheinlich hat es bei dir nicht einmal viel Zeit gekostet, dies zu erstellen.
Bitte gib mir etwas Zeit mich damit auseinander zusetzen. Spätestens nächste Woche werde ich ein Update posten.

Riesen Dank auf jeden Fall!

Viele Grüße

Jens (kaiuwe28)