BastiFantasti 0 Geschrieben 9. September 2022 Melden Teilen Geschrieben 9. September 2022 (bearbeitet) Hi @all, ich bin neu hier im Forum und ein absoluter Beginner im Thema Scripting und Powershell. Einfach Sachen bekomme ich noch hin, aber bei diesem Thema brauche ich mal die Hilfe der Community. Ich versuche mich kurz zu fassen, allerdings ist das Thema ein bisschen umfangreich. Ich hoffe ihr könnt mir bei der Lösung helfen. Ich habe schon gefühlt tausende Beiträge in allerlei Foren gelesen und mich daran versucht, allerdings war das nicht von Erfolg gekrönt. ich hab halt von xml gar keine Ahnung und bei Powershell bin ich blutiger Anfänger. Ich habe zwei typen von XML Dateien, einmal die Payable für Eingangsrechnungen und einmal receivable für Ausgangsrechnungen. Diese werden bei einem Export aus unserem WaWi Programm erzeugt. Nun sollen diese Dateien in ein anderes Programm zur Weiterverarbeitung eingelesen werden. Allerdings benötigt dieses Programm die Saldokennzeichen S und H. An welcher Stelle ist egal, das kann ich beim Import definieren. Es kann auch eine zusätzliche Node hinzugefügt werden. Meine Idee war nun, das ich mit einem Script die xml öffne, eine node in der xml welche ich nicht brauche in S oder H ändere. Es handelt sich dabei um die Zeile <exchangeRate>1.000000</exchangeRate> hier müsste nur der Wert 1.000000 abgeändert werden in S und H. Und zwar bei Payable in S und bei receivable in H. Anbei zwei Beispiel xml Dateien., Vielleicht hat ja einer die zündende Idee für mich. Ich habe auch zwei Testdateien angehangen, da in den CodeTags die Strucktur der xml verloren geht. Die Dateien liegen immer in einem bestimmten Ordner mit der Namensstruktur Rechnungsdaten*.xml. Die Dati muss zwingend nach dem abspeichern den selben Namen behalten. Für Receiveable <?xml version="1.0" encoding="utf-8"?> <LedgerImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="5.0" generator_info="c-entron software gmbh" xml_data="Kopie nur zur Verbuchung berechtigt nicht zum Vorsteuerabzug" xsi:schemaLocation="http://xml.datev.de/bedi/tps/ledger/v050" Belegverwaltung_online_ledger_import_v050.xsd" xmlns="http://xml.datev.de/bedi/tps/ledger/v050;>" <consolidate consolidatedAmount="121.50" consolidatedDate="2022-06-07" consolidatedInvoiceId="470985" consolidatedCurrencyCode="EUR"> <accountsReceivableLedger> <date>2022-06-07</date> <amount>59.50</amount> <accountNo>8404</accountNo> <costCategoryId>1</costCategoryId> <tax>19.00</tax> <currencyCode>EUR</currencyCode> <invoiceId>470985</invoiceId> <bookingText>Testikowsi - 470985</bookingText> <partyId>46208</partyId> <internalInvoiceId>470985</internalInvoiceId> <exchangeRate>1.000000</exchangeRate> <dueDate>2022-06-07</dueDate> <bpAccountNo>46208</bpAccountNo> <customerName>Testikowsi </customerName> </accountsReceivableLedger> <accountsReceivableLedger> <date>2022-06-07</date> <amount>62.00</amount> <accountNo>8401</accountNo> <costCategoryId>1</costCategoryId> <tax>19.00</tax> <currencyCode>EUR</currencyCode> <invoiceId>470985</invoiceId> <bookingText>Testikowsi - 470985</bookingText> <partyId>46208</partyId> <internalInvoiceId>470985</internalInvoiceId> <exchangeRate>1.000000</exchangeRate> <dueDate>2022-06-07</dueDate> <bpAccountNo>46208</bpAccountNo> <customerName>Testikowsi </customerName> </accountsReceivableLedger> </consolidate> </LedgerImport> Für Payable <?xml version="1.0" encoding="utf-8"?> <LedgerImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="5.0" generator_info="c-entron software gmbh" xml_data="Kopie nur zur Verbuchung berechtigt nicht zum Vorsteuerabzug" xsi:schemaLocation="http://xml.datev.de/bedi/tps/ledger/v050" Belegverwaltung_online_ledger_import_v050.xsd" xmlns="http://xml.datev.de/bedi/tps/ledger/v050;>" <consolidate consolidatedAmount="121.87" consolidatedDate="2022-06-08" consolidatedInvoiceId="964419092" consolidatedCurrencyCode="EUR"> <accountsPayableLedger> <date>2022-06-08</date> <amount>121.87</amount> <accountNo>3401</accountNo> <costCategoryId>1</costCategoryId> <tax>19.00</tax> <currencyCode>EUR</currencyCode> <invoiceId>964419092</invoiceId> <bookingText>Also Deutschland GmbH - 209439</bookingText> <partyId>70202</partyId> <internalInvoiceId>209439</internalInvoiceId> <exchangeRate>1.000000</exchangeRate> <dueDate>2022-07-08</dueDate> <bpAccountNo>70202</bpAccountNo> <supplierName>Also Deutschland GmbH</supplierName> <supplierCity>Soest</supplierCity> </accountsPayableLedger> </consolidate> </LedgerImport> Ich hoffe ihr könnt helfen Grüße Basti Rechnungsdaten_209020.xml Rechnungsdaten_209021.xml bearbeitet 9. September 2022 von BastiFantasti xml struktur wird nicht richtig angezeigt Zitieren Link zu diesem Kommentar
cj_berlin 1.329 Geschrieben 9. September 2022 Melden Teilen Geschrieben 9. September 2022 Moin, XML kann man in PowerShell objektorientiert verarbeiten: https://www.educba.com/powershell-xml/ Dann wäre exchangeRate eine Property, der Du ein 'H' oder ein 'S' zuweisen kannst. Zitieren Link zu diesem Kommentar
BastiFantasti 0 Geschrieben 9. September 2022 Autor Melden Teilen Geschrieben 9. September 2022 vor 19 Minuten schrieb cj_berlin: Moin, XML kann man in PowerShell objektorientiert verarbeiten: https://www.educba.com/powershell-xml/ Dann wäre exchangeRate eine Property, der Du ein 'H' oder ein 'S' zuweisen kannst. ich komme irgendwie nicht mit den root, child subchild zurecht. Mein Ansatz war ja der folgende, den habe ich mir aus diversen Forenbeitragen zusammengebastelt.... $werte = @{'1.00000'='S';'B'='H'} $files = gci "T:\teststammdaten\xml\*.xml" $files | %{ $xml = [xml](gc $_.Fullname) $werte.GetEnumerator() | %{ $exchangeRate = $xml.LedgerImport.consolidate.accountPayableLegder.exchangeRate if ($exchangeRate -eq $_.Name){ $xml.LedgerImport.consolidate.accountPayableLegder.exchangeRate = $_.Value } } $xml.Save($_.Fullname) } Zitieren Link zu diesem Kommentar
cj_berlin 1.329 Geschrieben 9. September 2022 Melden Teilen Geschrieben 9. September 2022 Folgendes funktioniert (mit Ausnahme der Zeile 2, aber das könnte Copy-/Paste-Artefakte sein): $ledger = [xml](Get-Content C:\Temp\ledger.xml) $ledger.LedgerImport.consolidate.accountsReceivableLedger.ForEach({$_.exchangeRate='H'}) $ledger.Save("c:\temp\ledger-processed.xml") Du hast vermutlich übersehen, dass es in einem consolidate-Element mehrere accountsReceivableLedger-Elemente gibt. Und der Umweg über die HashTable ist zwar interessant. aber nach Deiner Beschreibung brauchst Du ihn nicht - es ist ja entweder Payable oder Receivable, und dann weißt Du ja, was reinkommt. Zitieren Link zu diesem Kommentar
BastiFantasti 0 Geschrieben 9. September 2022 Autor Melden Teilen Geschrieben 9. September 2022 Leider kommt bei mir immer der folgende Fehlercode: S C:\Users\sebastian.ruebbelke> $ledger = [xml](Get-Content T:\teststammdaten\xml\Rechnungsdaten_*.xml) $ledger.LedgerImport.consolidate.accountsReceivableLedger.ForEach({$_.exchangeRate='H'}) $ledger.Save("c:\temp\ledger-processed.xml") Der Wert "System.Object[]" kann nicht in den Typ "System.Xml.XmlDocument" konvertiert werden. Fehler: "Unerwartete XML-Deklaration. Die XML-Deklaration muss der erste Knoten im Dokument sein. Davor sind keine Leerzeichen zulässig. Zeile 24, Position 3." In Zeile:1 Zeichen:1 + $ledger = [xml](Get-Content T:\teststammdaten\xml\Rechnungsdaten_*.xm ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [], RuntimeException + FullyQualifiedErrorId : InvalidCastToXmlDocument Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat. In Zeile:3 Zeichen:1 + $ledger.Save("c:\temp\ledger-processed.xml") + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull PS C:\Users\sebastian.ruebbelke> $ledger = [xml](Get-Content T:\teststammdaten\xml\Rechnungsdaten_209018.xml) $ledger.LedgerImport.consolidate.accountsReceivableLedger.ForEach({$_.exchangeRate='H'}) $ledger.Save("c:\temp\ledger-processed.xml") PS C:\Users\sebastian.ruebbelke> Zitieren Link zu diesem Kommentar
NilsK 2.957 Geschrieben 9. September 2022 Melden Teilen Geschrieben 9. September 2022 Moin, wenn ich die in der Fehlermeldung zitierte Zeile richtig deute, hast du dort ja auch keinen XML-Dokumentnamen angegeben, sondern einen Suchstring mit *. Dann kommt auch kein XML-Dokument zurück. Zitat T:\teststammdaten\xml\Rechnungsdaten_*.xm ... Gruß, Nils Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.