Jump to content

Wert in einer .xml suchen und ersetzen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 von BastiFantasti
xml struktur wird nicht richtig angezeigt
Link zu diesem Kommentar
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)
}

 

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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> 

 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...