XML mit Powershell auslesen und TreeView füllen
Hi@Alle XML Powershell Profi's,
Zum Test will ich den Inhalt meines Beispiel XML Files in einer TreeView darstellen.
Inhalt des Files in das Variable(Objekt?) $xml laden.
Wenn ich den obrigen Block ohne ID="Adobe" versehe bekomme ich die Variablen ausgelesen.
Wenn ich nun das TreeView füllen will bekomme ich das mit folgendem hin:
Allerdings scheiters immo noch wenn ich dem TAG Hersteller eine ID mitgebe. Die Idee mit der ID ist das ich im Block <Program> nicht noch den Herstellernamen mitschleppen muss sondern das eine Ebene höher einmal abgefackelt wird.
Das Füllen muss ich auch noch dynamisch hinbekommen, da wird dann eine foreach Schleife herhalten müssen, aber soweit bin ich noch nicht
Gruß
<Data>
<Hersteller ID="Adobe">
<Program>
<Name>Adobe Reader</Name>
<Version>11</Version>
</Program>
<Program>
<Name>Adobe Professional</Name>
<Version>7</Version>
</Program>
</Hersteller>
<Hersteller ID="Microsoft">
<Program>
<Name>Visual Studio</Name>
<Version>11</Version>
</Program>
<Program>
<Name>Office</Name>
<Version>2013</Version>
</Program>
</Hersteller>
</Data>
Zum Test will ich den Inhalt meines Beispiel XML Files in einer TreeView darstellen.
Inhalt des Files in das Variable(Objekt?) $xml laden.
$xml = [XML] (Get-Content -Path c:\temp\Beispiel.xml)
<Hersteller>
<Program>
<Name>Adobe Reader</Name>
<Version>11</Version>
</Program>
<Hersteller>
Wenn ich den obrigen Block ohne ID="Adobe" versehe bekomme ich die Variablen ausgelesen.
$Collection =$xml.DB.Data.Hersteller.Program
$ProgramName = $Collection | %($_.Name)
$ProgramVersion = $Collection | %($_.Version)
Wenn ich nun das TreeView füllen will bekomme ich das mit folgendem hin:
$treeView1.Nodes.Add($Hersteller)
$treeView1.Nodes.Nodes.Add($ProgramName)
$treeView1.Nodes.Nodes.Nodes.Add($ProgramVersion)
Allerdings scheiters immo noch wenn ich dem TAG Hersteller eine ID mitgebe. Die Idee mit der ID ist das ich im Block <Program> nicht noch den Herstellernamen mitschleppen muss sondern das eine Ebene höher einmal abgefackelt wird.
Das Füllen muss ich auch noch dynamisch hinbekommen, da wird dann eine foreach Schleife herhalten müssen, aber soweit bin ich noch nicht
Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 242481
Url: https://administrator.de/forum/xml-mit-powershell-auslesen-und-treeview-fuellen-242481.html
Ausgedruckt am: 16.04.2025 um 22:04 Uhr
6 Kommentare
Neuester Kommentar
Moin,
Dies passt jetzt auf die Beispiel-XML-Datei.
Wenn man eine XML-Datei universell parsen möchte, also alle Nodes egal wie tief verschachtelt, kann man dies mit einem rekursiven Aufruf machen:
Beispiel
Dieser Funktion muss man dann initial einen XML-Knoten übergeben ab dem das XML-File geparst wird und einen Knoten im Treeview-Objekt ab dem man das XML-File darstellen möchte.
Grüße Uwe
$xml = new-object XML
$xml.Load("c:\temp\Beispiel.xml")
$treeView1.Nodes.Clear()
$rootNode = $treeView1.Nodes.Add($xml.ChildNodes.Name)
$xml.Data.Hersteller | %{$tn = $rootNode.Nodes.Add($_.ID); $_.Program | %{$tn.Nodes.Add($_.Name+" "+$_.Version)}}
Wenn man eine XML-Datei universell parsen möchte, also alle Nodes egal wie tief verschachtelt, kann man dies mit einem rekursiven Aufruf machen:
Beispiel
function parseXML([System.Xml.XmlNode]$node,[System.Windows.Forms.TreeNode]$treenode){
$node.Childnodes | %{$tn = $treenode.Nodes.Add($_.Name); parseXML $_ $tn}
}
Beispiel: Universeller XML to TreeView-Parser
# Form Function
function GenerateForm {
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion
#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$treeView1 = New-Object System.Windows.Forms.TreeView
$btnLoadXML = New-Object System.Windows.Forms.Button
$openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects
#----------------------------------------------
# Event Script Blocks
#----------------------------------------------
$handler_btnLoadXML_Click=
{
if ($openFileDialog1.ShowDialog()){
$treeView1.Nodes.Clear()
$xml = new-object XML
$xml.Load($openFileDialog1.FileName)
$rootNode = $treeView1.Nodes.Add($xml.ChildNodes.Name)
parseXML $xml.DocumentElement $rootNode
}
}
function parseXML([System.Xml.XmlNode]$node,[System.Windows.Forms.TreeNode]$treenode){
$node.Childnodes | %{$tn = $treenode.Nodes.Add($_.Name); parseXML $_ $tn}
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form1.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 217
$System_Drawing_Size.Width = 222
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"
$form1.Text = "XML to TreeView"
$treeView1.Anchor = 15
$treeView1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 41
$treeView1.Location = $System_Drawing_Point
$treeView1.Name = "treeView1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 164
$System_Drawing_Size.Width = 198
$treeView1.Size = $System_Drawing_Size
$treeView1.TabIndex = 1
$form1.Controls.Add($treeView1)
$btnLoadXML.Anchor = 13
$btnLoadXML.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$btnLoadXML.Location = $System_Drawing_Point
$btnLoadXML.Name = "btnLoadXML"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 198
$btnLoadXML.Size = $System_Drawing_Size
$btnLoadXML.TabIndex = 0
$btnLoadXML.Text = "XML-Datei laden"
$btnLoadXML.UseVisualStyleBackColor = $True
$btnLoadXML.add_Click($handler_btnLoadXML_Click)
$form1.Controls.Add($btnLoadXML)
$openFileDialog1.FileName = "fd"
$openFileDialog1.Filter = "XML-Dateien|*.xml"
$openFileDialog1.ShowHelp = $True
#endregion Generated Form Code
#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null
} #End Function
GenerateForm
geht hier einwandfrei mit deinem XML-Schnippsel:
DEMO:
DEMO:
#Generated Form Function
function GenerateForm {
#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
#endregion
#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$treeView1 = New-Object System.Windows.Forms.TreeView
$btnLoadXML = New-Object System.Windows.Forms.Button
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects
#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
$rawXML = @"
<Data>
<Hersteller ID="Adobe">
<Program>
<Name>Adobe Reader</Name>
<Version>11</Version>
</Program>
<Program>
<Name>Adobe Professional</Name>
<Version>7</Version>
</Program>
</Hersteller>
<Hersteller ID="Microsoft">
<Program>
<Name>Visual Studio</Name>
<Version>11</Version>
</Program>
<Program>
<Name>Office</Name>
<Version>2013</Version>
</Program>
</Hersteller>
</Data>
"@
$handler_btnLoadXML_Click=
{
$treeView1.Nodes.Clear()
$xml = new-object XML
$xml.LoadXml($rawXML)
$rootNode = $treeView1.Nodes.Add($xml.ChildNodes.Name)
$xml.Data.Hersteller | %{$tn = $rootNode.Nodes.Add($_.ID); $_.Program | %{$tn.Nodes.Add($_.Name+" "+$_.Version)}}
}
$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
$form1.WindowState = $InitialFormWindowState
}
#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 217
$System_Drawing_Size.Width = 222
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"
$form1.Text = "XML to TreeView"
$treeView1.Anchor = 15
$treeView1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 41
$treeView1.Location = $System_Drawing_Point
$treeView1.Name = "treeView1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 164
$System_Drawing_Size.Width = 198
$treeView1.Size = $System_Drawing_Size
$treeView1.TabIndex = 1
$form1.Controls.Add($treeView1)
$btnLoadXML.Anchor = 13
$btnLoadXML.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 12
$btnLoadXML.Location = $System_Drawing_Point
$btnLoadXML.Name = "btnLoadXML"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 198
$btnLoadXML.Size = $System_Drawing_Size
$btnLoadXML.TabIndex = 0
$btnLoadXML.Text = "XML parsen"
$btnLoadXML.UseVisualStyleBackColor = $True
$btnLoadXML.add_Click($handler_btnLoadXML_Click)
$form1.Controls.Add($btnLoadXML)
#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null
} #End Function
#Call the Function
GenerateForm