epsodus 3 Geschrieben 10. März 2020 Autor Melden Teilen Geschrieben 10. März 2020 Dann sagen wir es mal so, in Deinem Geburtsjahr habe ich meine Ausbildung begonnen, demnach bin ich kein alter Herr, sondern ein Greis. Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 10. März 2020 Melden Teilen Geschrieben 10. März 2020 vor 6 Stunden schrieb epsodus: $OutFileId = $Node.TechRcrdId ERROR: In C:\DTCC TEST\Sta_Einlesen_Test.ps1:48 Zeichen:31 ERROR: + $OutFileId = $Node.TechRcrdId ERROR: + ~ ERROR: Unerwartetes Token "" in Ausdruck oder Anweisung. ERROR: + CategoryInfo : ParserError: (:) [], ParseException ERROR: + FullyQualifiedErrorId : UnexpectedToken ERROR: Da müßte man jetzt wissen, was in $Node.OuterXML genau drinsteht. Vermutlich ein Syntax Error Oder $Node ist leer bzw enthält das falsche. Klassischer Fall von "zeige die kompletten Daten, dann können wir komplett helfen". vor einer Stunde schrieb epsodus: Dann sagen wir es mal so, in Deinem Geburtsjahr habe ich meine Ausbildung begonnen, demnach bin ich kein alter Herr, sondern ein Greis. Das entschuldigt aber nix - und es beschönigt auch nichts Nils ist eh einer der Jungspunde IMHO... 1 Zitieren Link zu diesem Kommentar
NilsK 2.957 Geschrieben 11. März 2020 Melden Teilen Geschrieben 11. März 2020 Moin, ihr seid ja so nett wie mein Kardiologe. Bei dem gehe ich auch als "sehr junger Mann" durch. Letzte Woche beim Blond-Konzert war ich sehr deutlich der Älteste, dabei hatten einige sogar ihre Eltern mit (ich hingegen habe niemanden begleitet). "Alter Herr" war eigentlich auch im universitären* Sinne gemeint, aber nach den sehr erfrischenden Reaktionen hier werde ich das wohl öfter mal kontextfremd einstreuen. Gruß, Ni"Jungbrunnen"ls PS. * "universitär" ist mir wichtig, ich meine das ausdrücklich nicht "burschenschaftlich" Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 11. März 2020 Melden Teilen Geschrieben 11. März 2020 Mir persönlich ist "universell" wichtiger als "universitär" - auch wenn das vielleicht sogar was ähnliches bedeutet BTT: @epsodus Wie ist denn der Stand Deiner Skripting-Erfahrungen? Zitieren Link zu diesem Kommentar
epsodus 3 Geschrieben 12. März 2020 Autor Melden Teilen Geschrieben 12. März 2020 Hallo, es geht so für den Hausgebrauch, mein Problem ist das arbeiten mit XML Dateien Was ich wollte ist, die mitgelieferte XML Datei ( TestXML.XML als Beispiel )parsen, im unteren Script mit einem Vorschlag von Martin. Finde ich beim parsen eine LEI, dann eine neue XML Datei erstellen, mit dem Namen der gefundenen Lei. Den Knoten mit der gefundenen Lei in die erzeugt XML Datei einfügen. Das schaffe ich nicht Hier der Knoten mit der LEI 324400KX2BNAYXBQMT36 <TxId> <RptgCtrPty> <LEI>324400KX2BNAYXBQMT36</LEI> </RptgCtrPty> <OthrCtrPty> <LEI>OTHER</LEI> </OthrCtrPty> <UnqTradIdr>OTHER</UnqTradIdr> <MstrAgrmt> <TP> <TP>OTHER</TP> </TP> <OthrMstrAgrmtDtls>OTHER</OthrMstrAgrmtDtls> </MstrAgrmt> </TxId> Zugleich erstelle ich eine XML Datei $xml = [xml](Get-Content "C:\XMLDatei\TestXML.xml") Foreach ($Node in $xml.SctiesFincgRptgMssngCollReq.TxId.RptgCtrPty) { $Node.InnerXml #$Node.OuterXml #$OutFileId = $Node.LEI } # XML Dokument erstellen # Set The Formatting $xmlsettings = New-Object System.Xml.XmlWriterSettings $xmlsettings.Indent = $true $xmlsettings.IndentChars = " " # Erzeuge Filename vom Dokument $XmlWriter = [System.XML.XmlWriter]::Create("C:\XML_Test\TestXML.xml", $xmlsettings) # Schreibe XML-Deklaration - Struktur festlegen $xmlWriter.WriteStartDocument() #$xmlWriter.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='style.xsl'") # Start Wurzelelement $xmlWriter.WriteStartElement("SctiesFincgRptgMssngCollReq") $xmlWriter.WriteStartElement("TxId") # <-- Start <Object - TxID> $xmlWriter.WriteStartElement("RptgCtrPty") # <-- Start <SubObject - RptgCtrPty> $xmlWriter.WriteElementString("LEI", "324400KX2BNAYXBQMT37") $xmlWriter.WriteEndElement() # <-- Ende <SubObject> $xmlWriter.WriteStartElement("OthrCtrPty") # <-- Start <SubObject - OthrCtrPty> $xmlWriter.WriteElementString("LEI", "OTHER") $xmlWriter.WriteEndElement() # <-- Ende <SubObject> $xmlWriter.WriteElementString("UnqTradIdr", "OTHER") $xmlWriter.WriteStartElement("MstrAgrmt") # <-- Start <Object - MstrAgrmt> $xmlWriter.WriteStartElement("TP") # <-- Start <SubObject - TP> $xmlWriter.WriteElementString("TP", "OTHER") $xmlWriter.WriteEndElement() # <-- Ende <SubObject> $xmlWriter.WriteElementString("OthrMstrAgrmtDtls", "OTHER") $xmlWriter.WriteEndElement() # <-- Ende <SubObject> $xmlWriter.WriteEndElement() # <-- Ende <Object> # Beenden, finalisieren und schließen des XML-Dokument $xmlWriter.WriteEndDocument() $xmlWriter.Flush() $xmlWriter.Clos TestXML.xml Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 12. März 2020 Melden Teilen Geschrieben 12. März 2020 Du gönnst uns also zum Testen nicht mal eine XML, die wenigstens mal 2 oder 3 der Knoten enthält, von denen Du dann in der resultierenden XML nur noch einen behalten willst .... Zitieren Link zu diesem Kommentar
epsodus 3 Geschrieben 12. März 2020 Autor Melden Teilen Geschrieben 12. März 2020 Hi, anbei ein neues xml File mit mehreren Knoten. Es sollte dann für jeden Knoten XML File erstellt werden. Ich teste gerade auch noch. TestXML.xml Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 12. März 2020 Melden Teilen Geschrieben 12. März 2020 Entweder suchst Du den LEI-Node mit XPath oder arbeitest trivial mit Try/Catch. Im Try greifst auf den LEI-Node zu, und (ohne das probiert zuhaben) das wirft dann entweder eine Exception (-> goto Catch) oder liefert $null. Beides sollte machbar sein. So sinngemäß: Try { If ( $Node.LEI ) { # Mach irgendwas } Else [ # Mach nix } } Catch { # Mach irgendwas anderes } Ist mir grad zu spät zum noch ausprobieren, gefühlt landest Du im Else-Block, wenn LEI nicht existiert. Frage: Wozu brauchst Du nen XMLWriter? Das ist doch in Powershell alles schon drinne... Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. März 2020 Melden Teilen Geschrieben 13. März 2020 Erzähl mir was Du willst ... ich bleibe dabei ... XML is weder einfach noch intuitiv und definitiv is XML nix für mich! $startFolder = 'D:\sample' $inputXML = 'TestXML.xml' $inputXMLFile = Join-Path -Path $startFolder -ChildPath $inputXML $xml = [xml](Get-Content $inputXMLFile) Foreach ($ChildNode in $xml.SctiesFincgRptgMssngCollReq.TxId) { $CurrentXMLFileName = Join-Path -Path $startFolder -ChildPath ($ChildNode.RptgCtrPty.lei.ToString() + '.xml') $NewXML = New-Object System.Xml.XmlDocument $declaration = $NewXML.CreateXmlDeclaration("1.0", "UTF-8", $null) $NewXML.AppendChild($declaration) $RootNode = $NewXML.CreateNode('element', 'SctiesFincgRptgMssngCollReq', $null) $NewXML.AppendChild($RootNode) $NewElement = $NewXML.ImportNode($ChildNode, $true) $Root = $NewXML.SelectSingleNode('SctiesFincgRptgMssngCollReq') $Root.AppendChild($NewElement) $NewXML.Save($CurrentXMLFileName) } Zitieren Link zu diesem Kommentar
epsodus 3 Geschrieben 13. März 2020 Autor Melden Teilen Geschrieben 13. März 2020 Hallo, ich sage mal Danke. Werde jetzt mal den Code von BOfH_666 auserinandernehmen. Versuche ihn für mich zu dokumentieren und dann zu verstehen. Werde ihn noch was erweitern und melde mich dann. Nochmals ein RIESEN DANKE Zitieren Link zu diesem Kommentar
epsodus 3 Geschrieben 13. März 2020 Autor Melden Teilen Geschrieben 13. März 2020 Hi BOFH_666, mal eine ganz blöde Frage, was passiert wenn es in einem XML File, 2 identische Lei's gibt, im Knoten aber ein anderer Inhalt ist. Dann überschreibt die eine Datei die andere. Kann Du es beim Script so machen, wenn eine identische bzw. schon vorhandene Leigefunden wird, das im dann schon erstelleten XML File, dieser Knoten hinzugefügt wird ? ? Anbei eine neues XML File Jetzt verlange ich wohl zuviel.... TestneuXML.XML Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. März 2020 Melden Teilen Geschrieben 13. März 2020 vor 47 Minuten schrieb epsodus: mal eine ganz blöde Frage, was passiert wenn es in einem XML File, 2 identische Lei's gibt, im Knoten aber ein anderer Inhalt ist. Dann überschreibt die eine Datei die andere. ... is keine blöde Frage (auch wenn das Fragezeichen fehlt ) ... und "ja", dann gibt's ne Fehlermeldung oder die bereits existierende Datei wird überschrieben ... je nach dem, wie Du's in Deinem Code gemacht hast. vor 47 Minuten schrieb epsodus: Kann Du es beim Script so machen, wenn eine identische bzw. schon vorhandene Leigefunden wird, das im dann schon erstelleten XML File, dieser Knoten hinzugefügt wird ? ? Nö ... ... wie oben schon nebenbei erwähnt ... ich mag kein XML und deshalb würde ich's für mich so einfach wie möglich halten wollen. Was mir spontan einfällt, wäre, einfach ein weiteres Merkmal des XML-Knotens heranzuziehen, um den Dateinamen wieder eineindeutig zu machen. Wie Du hoffentlich im Code erkannt hast, prüfe ich in der Schleife nicht auf irgendwas, sondern nehme einfach einen Node nach dem anderen und behandle alle gleich. Wenn also wie in Deiner neuen XML-Datei die LEI nicht genügt, dann nimmst Du "Test 4" oder "Birne" dazu und schon ist wieder alles eindeutig. vor 50 Minuten schrieb epsodus: Jetzt verlange ich wohl zuviel.... siehe einen Absatz weiter oben. Zitieren Link zu diesem Kommentar
epsodus 3 Geschrieben 20. März 2020 Autor Melden Teilen Geschrieben 20. März 2020 Hallo, hat etwas gedauert, habe das Programm mal aufgeräumt und dokumentiert. das Überschreiben mit einer gefundenen und doppelten Lei habe ich jetzt auch gelöst. Jetzt muss ich die erstellten Files nur noch gegen das Excelsheet abgleichen ( Spalte C ) und bei einer Übereinstimmung renamen, Wert aus Excelsheet Spalte (A) in der gleichen Zeile wie der gefundene Wert aus Spalte C. Das File soll dann mit dem Wert aus Spalte A anfangen. Da happert es noch. #-------------------------------------------------------------------------------------------------------------------------------------------- # ROOTVERZEICHNIS, wo die zu verarbeitende Quell Datei liegt $Gaudet_ROOT = "C:\TEMP" $Gaudet_ROOTFILE = $Gaudet_ROOT + "\" + $XML_FILE #-------------------------------------------------------------------------------------------------------------------------------------------- # Verzeichnis wo die neu erstellten Files abgelegt werden $Gaudet_RSRXML = "C:\TEMP\TESTARCHIV" $Gaudet_RSRXMLFILE = $Gaudet_RSRXML + "\" + $XML_FILE #-------------------------------------------------------------------------------------------------------------------------------------------- # Verzeichnis wo das Excel File liegt $ExcelMappe = "C:\TEMP\ExcelArchiv" #-------------------------------------------------------------------------------------------------------------------------------------------- function gaudet_RSRXML {# Das XML File wird extrahiert, aus jedem Knoten ( LEI) wird ein separates File erstellt, die LEI des Knoten vorangestellt "function gaudet_RSRXML" $inputXMLFile = Join-Path -Path $Gaudet_ROOT -ChildPath $XML_FILE $xml = [xml](Get-Content $inputXMLFile) Foreach ($ChildNode in $xml.SctiesFincgRptgMssngCollReq.TxId) { $CurrentXMLFileName = Join-Path -Path $Gaudet_RSRXML -ChildPath ($ChildNode.RptgCtrPty.lei.ToString() + "." + $XML_FILE) $NewXML = New-Object System.Xml.XmlDocument $declaration = $NewXML.CreateXmlDeclaration("1.0", "UTF-8", $null) $NewXML.AppendChild($declaration) $RootNode = $NewXML.CreateNode('element', 'SctiesFincgRptgMssngCollReq', $null) $NewXML.AppendChild($RootNode) $NewElement = $NewXML.ImportNode($ChildNode, $true) $Root = $NewXML.SelectSingleNode('SctiesFincgRptgMssngCollReq') $Root.AppendChild($NewElement) #$File1.DocumentElement.AppendChild($File1.ImportNode($XmlNode, $true)) $FILE = ($ChildNode.RptgCtrPty.lei + "." + $XML_FILE) # Überschreiben einer doppelten Lei wird verhindert, kommt ein File zweimal vor, dann wird ein datum hinten dran gehängt $TESTPATH = Test-Path -path ($Gaudet_RSRXML + "\" + $FILE) if ($TESTPATH -eq $TRUE) { rename-item -Path ($Gaudet_RSRXML + "\" + $FILE) -NewName ($FILE + "_" + (get-date).ToString("yyyyMMdd_HHmmss")) #$File.DocumentElement.AppendChild($File.ImportNode($ChildNode, $true)) } $NewXML.Save($CurrentXMLFileName) Write-Host $ChildNode.RptgCtrPty.lei Write-Host $CurrentXMLFileName } } #H A U P T S C R I P T für XML Dateien ############################################################################################ #----------------------------------------------------------------------- #Liste der Dateinamen *.XML, die angeliefert wurden if ($Gaudet_FILELIST = get-childitem $Gaudet_ROOT -filter *.xml) { $Gaudet_COUNT = (get-childitem $Gaudet_ROOT -filter *.xml).count "Im Ordner " + $Gaudet_ROOT + " liegen folgende " + $Gaudet_COUNT + " Dateien: " + $Gaudet_FILELIST <# #Jede der angelieferten Dateien .xml in netroot\import\dtcc wird bearbeitet. Die erste Zeile in der Datei wird ausgeschnitten. # Die angelieferte Datei entspricht nicht der XML Struktur, durch XXXX wird eine zusätzliche Zeile eingefügt, welche entfernt wird. $file = "$Gaudet_ROOT\*.xml" Get-ChildItem -Path $file -File -Filter *.xml | ForEach-Object { (Get-Content -Path $_.FullName | Select-Object -Skip 1) | Set-Content -Path $_.FullName -Encoding UTF8 #> } #Jede der angelieferten Dateien in netroot\import\dtcc wird nach mehreren Mustern durchsucht. foreach ($XML_FILE in $Gaudet_FILELIST) { #Datei in netroot\import\DTCC $Gaudet_ROOTFILE = $Gaudet_ROOT + "\" + $XML_FILE #Dateiinhalt einlesen aus Datei in netroot\import\DTCC [array]$Gaudet_FILECONTENT = get-content (get-childitem $Gaudet_ROOTFILE) #Anzahl der Zeilen in der Datei netroot\import\DTCC $Gaudet_FILELINECOUNT = $Gaudet_FILECONTENT.count "Zeilen in der Datei: " + $Gaudet_FILELINECOUNT # S U C H M U S T E R für XML Dateien #----------------------------------------------------------------------- #Suchmuster für RSRXML-Dateien (3105 im Dateinamen ) $PATTERN_RSRXML = "YYY\d{1}\.XXXX\.T[A-Z0-9]{4}\.[A-Z0-9]{4}3105\.D[A-Z0-9]*\.Z[A-Z0-9]*\.K[\w\d\W]*\.XML" # YYY4.XXXX.TV9V9.55553105.D111111.Z999999.K02.0396.xml #$PATTERN_XLSXML = "[A-Z0-9]{20}\.YYY\d{1}\.XXXX\.T[A-Z0-9]{4}\.[A-Z0-9]{4}3105\.D[A-Z0-9]*\.Z[A-Z0-9]*\.K[\w\d\W]*\.XML" # 664400KX2BNAYXBQMT50.YYY4.XXXX.TV9V9.55553105.D111111.Z999999.K02.0396.XML #----------------------------------------------------------------------- if ($XML_FILE -match $PATTERN_RSRXML) { "HS_if1" gaudet_RSRXML } #else #{ # "else error" # dtcc_error #} } 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.