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ß
Please also mark the comments that contributed to the solution of the article
Content-Key: 242481
Url: https://administrator.de/contentid/242481
Printed on: April 25, 2024 at 06:04 o'clock
6 Comments
Latest comment
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