Jump to content
epsodus

XML Datei bearbeiten

Recommended Posts

Dann sagen wir es mal so, in Deinem Geburtsjahr habe ich meine Ausbildung begonnen, demnach bin ich kein alter Herr, sondern ein Greis.

Share this post


Link to post
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...

  • Like 1

Share this post


Link to post

Moin,

 

ihr seid ja so nett wie mein Kardiologe. Bei dem gehe ich auch als "sehr junger Mann" durch. :lol3:

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. :grins2:

 

Gruß, Ni"Jungbrunnen"ls

PS. * "universitär" ist mir wichtig, ich meine das ausdrücklich nicht "burschenschaftlich"

Share this post


Link to post

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?

Share this post


Link to post

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

Share this post


Link to post

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 ....  :hmmm:;-):rolleyes::grins2:

Share this post


Link to post

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...

Share this post


Link to post

Erzähl mir was Du willst ... ich bleibe dabei ... XML is weder einfach noch intuitiv und definitiv is XML nix für mich!  :aetsch2:

$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)
}

 

Share this post


Link to post

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

Share this post


Link to post

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

Share this post


Link to post
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. ;-) 

Share this post


Link to post

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
		#}
	}

 

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Werbepartner:



×
×
  • Create New...