Jump to content

XML Datei bearbeiten


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

Recommended Posts

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

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

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

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

 

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

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

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

 

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

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.   Paste as plain text instead

  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.

×
×
  • Create New...