bugger
Goto Top

Powershell - Zeilen aus txt Datei auslesen, bearbeiten und in xml einfügen

Hallo,

ich möchte das jede Zeile einer Textdatei in diesem Schema gepackt
<Pattern PatternValue = '*.Zeileaustxtdatei'></Pattern>  
und diese werte nacheinander ab Zeile 9 in eine bestehende xml Datei importiert werden.
Ich habe leider nichts hilfreiches zu genau diesem Scenario gefunden, aber gehen tut das bestimmt face-smile

Danke und Gruß
Bugger

Content-Key: 369056

Url: https://administrator.de/contentid/369056

Printed on: April 27, 2024 at 05:04 o'clock

Mitglied: 135799
135799 Mar 23, 2018 updated at 10:48:33 (UTC)
Goto Top
XML-Dateien bearbeitet man nie so mit Stringmethoden, man sollte sie immer durch einen Parser jagen und mit dessen Methoden die Elemente hinzufügen.
Wenn du uns den ersten Ausschnitt (vom Anfang an) deiner XML postest können wir dir helfen.

Schnuffi
Member: Bugger
Bugger Mar 23, 2018 updated at 10:51:49 (UTC)
Goto Top
<?xml version="1.0" ?>  
<Root>
<Header DatabaseVersion = '2.0'>  
</Header><QuotaTemplates></QuotaTemplates>
<DatascreenTemplates></DatascreenTemplates>
<FileGroups>
<FileGroup Name = 'Test' Id = '{DC7085DD-D915-438A-B7BG-7211DD846310}' Description = ''>  
<Members>

Direkt nach <Members> sollen dann der Schnipsel oben eingefügt werden.
Mitglied: 135799
Solution 135799 Mar 23, 2018 updated at 11:03:23 (UTC)
Goto Top
$pathfile = 'D:\test.txt'  
$pathxml = 'D:\test.xml'  
$xml = new-Object XML
$xml.XmlResolver = $null
$xml.Load($pathxml)
$node = $xml.SelectSingleNode("//FileGroup/Members")  

Get-Content $pathfile | %{
    $el = $xml.CreateElement("Pattern")  
    $at = $xml.CreateAttribute("PatternValue")  
    $at.Value = $_
    $el.Attributes.Append($at)
    $node.AppendChild($el)
}
$xml.Save($pathxml)
Member: Bugger
Bugger Mar 23, 2018 at 11:14:00 (UTC)
Goto Top
Das funktioniert schonmal sehr gut, vielen Dank dafür. Hast du Einfluss auf die Formatierung?

Statt
<Pattern PatternValue = 'xxx'></Pattern>  
macht er alles so
        <Pattern PatternValue="xxx">  
        </Pattern>

Und gibt es die Möglichkeit alles an den Anfang anstatt ans ende der Gruppe zu setzen?
Mitglied: 135799
135799 Mar 23, 2018 updated at 11:22:05 (UTC)
Goto Top
Zitat von @Bugger:

Das funktioniert schonmal sehr gut, vielen Dank dafür. Hast du Einfluss auf die Formatierung?

Statt
<Pattern PatternValue = 'xxx'></Pattern>  
macht er alles so
        <Pattern PatternValue="xxx">  
>         </Pattern>
Ob nun Anführungszeichen oder Hochkommas ist XML schnurz egal.
Und gibt es die Möglichkeit alles an den Anfang anstatt ans ende der Gruppe zu setzen?
Kann man, das kannst du auch selbst face-smile
PrependChild
Member: Bugger
Bugger Mar 23, 2018 at 11:27:57 (UTC)
Goto Top
Das mit den Anführungszeichen ist mir gar nicht aufgefallen face-smile Ich meinte den Zeilenumbruch und das </Pattern> nicht am ende steht.
Dadurch hat die Datei auf einmal über 2000 Zeilen anstatt nur etwas über 1000.^^
Mitglied: 135799
135799 Mar 23, 2018 updated at 11:33:54 (UTC)
Goto Top
Hab ich hier nicht
bei mir wird das ganze direkt so erzeugt, ist ja auch logisch da der Node kein Textnode besitzt:
<Pattern PatternValue = 'xxx' />
Da musst du musst du selbst einen Textnode (oder Zeilenumbruch) erzeugt haben, Standard ist das definitiv nicht.
Aber an der Funktion der XML und des Knotens ändert das auch nichts.
Member: Bugger
Bugger Mar 23, 2018 at 12:10:47 (UTC)
Goto Top
Habe den Fehler gefunden, dachte es läge an der Formatierung (was überhaupt keinen Sinn gemacht hat).

Es liegt an der Kodierung. Die .xml wird mit UTF-8 ohne BOM abgespeichert aber es muss UCS-2 Little Endian sein. Sonst funktioniert die xml nicht. Kann man die Kodierung vorgeben?
Mitglied: 135799
135799 Mar 23, 2018 updated at 12:33:08 (UTC)
Goto Top
aber es muss UCS-2 Little Endian sein. Sonst funktioniert die xml nicht. Kann man die Kodierung vorgeben?
Sowas gibt man in der XML Declaration an face-smile, dann wird das auch richtig verarbeitet!
Member: Bugger
Bugger Mar 23, 2018 at 12:39:16 (UTC)
Goto Top
Habe diesen Weg gefunden:

[System.Io.File]::ReadAllText($pathxml) | Out-File -FilePath $pathxml -Encoding Unicode
Das am Ende des Scripts und geht. Declaration hat nicht funktioniert.

Aber vielen Dank für die Hilfe, jetzt ist alles super! face-smile
Mitglied: 135799
135799 Mar 23, 2018 updated at 14:11:28 (UTC)
Goto Top
Dann reicht auch folgendes ohne das Ding erst zu speichern und dann neu auszulesen.
$xml.outerxml | sc $pathxml -Encoding Unicode
Oder mit StreamWriter.
$fs = new-object System.IO.FileStream([string]$pathxml,[System.IO.FileAccess]::Write)
$writer = New-Object System.IO.StreamWriter($fs,[System.Text.Encoding]::Unicode)
$xml.Save($writer)
$writer.Close()
$fs.Close()