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:
Die XML Datei ist wie folgt aufgebaut (hab mehrere verglichen) bzw. sieht wie folgt aus:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 354644
Url: https://administrator.de/contentid/354644
Ausgedruckt am: 16.11.2024 um 19:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo kaiuwe28,
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:
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
Ist das Minus vor den öffnenden Tags (
Gruß Frank
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
Hallo Jens,
Zitat von @kaiuwe28
Ich würde gerne wissen wie der "Feind" aussieht.
Zitat von @kaiuwe28
Gruß Frank
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
Hallo Jens,
Zitat von @kaiuwe28
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.
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
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
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!)
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
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
}
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