Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

XML mit Powershell auslesen und TreeView füllen

Frage Entwicklung XML

Mitglied: H41mSh1C0R

H41mSh1C0R (Level 2) - Jetzt verbinden

02.07.2014, aktualisiert 14:30 Uhr, 2750 Aufrufe, 6 Kommentare

Hi@Alle XML Powershell Profi's,

01.
<Data> 
02.
 <Hersteller ID="Adobe"> 
03.
  <Program> 
04.
    <Name>Adobe Reader</Name> 
05.
    <Version>11</Version> 
06.
  </Program> 
07.
  <Program> 
08.
   <Name>Adobe Professional</Name> 
09.
   <Version>7</Version> 
10.
  </Program> 
11.
 </Hersteller> 
12.
 <Hersteller ID="Microsoft"> 
13.
  <Program> 
14.
    <Name>Visual Studio</Name> 
15.
    <Version>11</Version> 
16.
  </Program> 
17.
  <Program> 
18.
   <Name>Office</Name> 
19.
   <Version>2013</Version> 
20.
  </Program> 
21.
 </Hersteller> 
22.
</Data>
Zum Test will ich den Inhalt meines Beispiel XML Files in einer TreeView darstellen.

Inhalt des Files in das Variable(Objekt?) $xml laden.
01.
$xml = [XML] (Get-Content -Path c:\temp\Beispiel.xml)
01.
<Hersteller> 
02.
  <Program> 
03.
    <Name>Adobe Reader</Name> 
04.
    <Version>11</Version> 
05.
  </Program> 
06.
<Hersteller>
Wenn ich den obrigen Block ohne ID="Adobe" versehe bekomme ich die Variablen ausgelesen.

01.
$Collection =$xml.DB.Data.Hersteller.Program 
02.
 
03.
$ProgramName = $Collection | %($_.Name) 
04.
$ProgramVersion = $Collection | %($_.Version)

Wenn ich nun das TreeView füllen will bekomme ich das mit folgendem hin:

01.
$treeView1.Nodes.Add($Hersteller[0]) 
02.
$treeView1.Nodes[0].Nodes.Add($ProgramName[0]) 
03.
$treeView1.Nodes[0].Nodes[0].Nodes.Add($ProgramVersion[0])
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ß




Mitglied: colinardo
LÖSUNG 02.07.2014, aktualisiert um 14:30 Uhr
Moin,
01.
 $xml = new-object XML 
02.
 $xml.Load("c:\temp\Beispiel.xml") 
03.
 $treeView1.Nodes.Clear() 
04.
 $rootNode = $treeView1.Nodes.Add($xml.ChildNodes[0].Name) 
05.
 $xml.Data.Hersteller | %{$tn = $rootNode.Nodes.Add($_.ID); $_.Program | %{$tn.Nodes.Add($_.Name+" "+$_.Version)}}
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
01.
function parseXML([System.Xml.XmlNode]$node,[System.Windows.Forms.TreeNode]$treenode){ 
02.
    $node.Childnodes | %{$tn = $treenode.Nodes.Add($_.Name); parseXML $_ $tn} 
03.
}
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.

Beispiel: Universeller XML to TreeView-Parser
01.
# Form Function 
02.
function GenerateForm { 
03.
 
04.
#region Import the Assemblies 
05.
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null 
06.
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null 
07.
#endregion 
08.
 
09.
#region Generated Form Objects 
10.
$form1 = New-Object System.Windows.Forms.Form 
11.
$treeView1 = New-Object System.Windows.Forms.TreeView 
12.
$btnLoadXML = New-Object System.Windows.Forms.Button 
13.
$openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog 
14.
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState 
15.
#endregion Generated Form Objects 
16.
 
17.
#---------------------------------------------- 
18.
# Event Script Blocks 
19.
#---------------------------------------------- 
20.
$handler_btnLoadXML_Click=  
21.
22.
    if ($openFileDialog1.ShowDialog()){ 
23.
        $treeView1.Nodes.Clear() 
24.
        $xml = new-object XML 
25.
        $xml.Load($openFileDialog1.FileName) 
26.
        $rootNode = $treeView1.Nodes.Add($xml.ChildNodes[0].Name) 
27.
        parseXML $xml.DocumentElement $rootNode 
28.
29.
 
30.
31.
 
32.
function parseXML([System.Xml.XmlNode]$node,[System.Windows.Forms.TreeNode]$treenode){ 
33.
    $node.Childnodes | %{$tn = $treenode.Nodes.Add($_.Name); parseXML $_ $tn} 
34.
35.
 
36.
$OnLoadForm_StateCorrection= 
37.
{#Correct the initial state of the form to prevent the .Net maximized form issue 
38.
	$form1.WindowState = $InitialFormWindowState 
39.
40.
 
41.
#---------------------------------------------- 
42.
#region Generated Form Code 
43.
$System_Drawing_Size = New-Object System.Drawing.Size 
44.
$System_Drawing_Size.Height = 217 
45.
$System_Drawing_Size.Width = 222 
46.
$form1.ClientSize = $System_Drawing_Size 
47.
$form1.DataBindings.DefaultDataSourceUpdateMode = 0 
48.
$form1.Name = "form1" 
49.
$form1.Text = "XML to TreeView" 
50.
 
51.
$treeView1.Anchor = 15 
52.
$treeView1.DataBindings.DefaultDataSourceUpdateMode = 0 
53.
$System_Drawing_Point = New-Object System.Drawing.Point 
54.
$System_Drawing_Point.X = 12 
55.
$System_Drawing_Point.Y = 41 
56.
$treeView1.Location = $System_Drawing_Point 
57.
$treeView1.Name = "treeView1" 
58.
$System_Drawing_Size = New-Object System.Drawing.Size 
59.
$System_Drawing_Size.Height = 164 
60.
$System_Drawing_Size.Width = 198 
61.
$treeView1.Size = $System_Drawing_Size 
62.
$treeView1.TabIndex = 1 
63.
 
64.
$form1.Controls.Add($treeView1) 
65.
 
66.
$btnLoadXML.Anchor = 13 
67.
 
68.
$btnLoadXML.DataBindings.DefaultDataSourceUpdateMode = 0 
69.
 
70.
$System_Drawing_Point = New-Object System.Drawing.Point 
71.
$System_Drawing_Point.X = 12 
72.
$System_Drawing_Point.Y = 12 
73.
$btnLoadXML.Location = $System_Drawing_Point 
74.
$btnLoadXML.Name = "btnLoadXML" 
75.
$System_Drawing_Size = New-Object System.Drawing.Size 
76.
$System_Drawing_Size.Height = 23 
77.
$System_Drawing_Size.Width = 198 
78.
$btnLoadXML.Size = $System_Drawing_Size 
79.
$btnLoadXML.TabIndex = 0 
80.
$btnLoadXML.Text = "XML-Datei laden" 
81.
$btnLoadXML.UseVisualStyleBackColor = $True 
82.
$btnLoadXML.add_Click($handler_btnLoadXML_Click) 
83.
 
84.
$form1.Controls.Add($btnLoadXML) 
85.
 
86.
$openFileDialog1.FileName = "fd" 
87.
$openFileDialog1.Filter = "XML-Dateien|*.xml" 
88.
$openFileDialog1.ShowHelp = $True 
89.
 
90.
#endregion Generated Form Code 
91.
 
92.
#Save the initial state of the form 
93.
$InitialFormWindowState = $form1.WindowState 
94.
#Init the OnLoad event to correct the initial state of the form 
95.
$form1.add_Load($OnLoadForm_StateCorrection) 
96.
#Show the Form 
97.
$form1.ShowDialog()| Out-Null 
98.
 
99.
} #End Function 
100.
 
101.
GenerateForm
Grüße Uwe
Bitte warten ..
Mitglied: H41mSh1C0R
02.07.2014 um 13:33 Uhr
Hallo Uwe,

schonmal danke, leider will das noch nicht so:

01.
ERROR: [ : Unable to index into an object of type System.Xml.XmlChildNodes. 
02.
ERROR: 
03.
MainForm.pff (177): ERROR: At Line: 177 char: 51 
04.
ERROR: +      $rootNode = $treeView1.Nodes.Add($xml.ChildNodes[ <<<< 0].Name) 
05.
ERROR:     + CategoryInfo          : InvalidOperation: (0:Int32) [], RuntimeException 
06.
ERROR:     + FullyQualifiedErrorId : CannotIndex 
07.
ERROR: 
08.
ERROR: Add : You cannot call a method on a null-valued expression. 
09.
ERROR: 
10.
MainForm.pff (178): ERROR: At Line: 178 char: 52 
11.
ERROR: +      $xml.Data.Hersteller | %{$tn = $rootNode.Nodes.Add <<<< ($_.ID); $_.Program | %{$tn.Nodes.Add($_.Name+" "+$_.Version)}} 
12.
ERROR:     + CategoryInfo          : InvalidOperation: (Add:String) [], RuntimeException 
13.
ERROR:     + FullyQualifiedErrorId : InvokeMethodOnNull 
14.
ERROR: 
15.
ERROR: Add : You cannot call a method on a null-valued expression. 
16.
ERROR: 
17.
MainForm.pff (178): ERROR: At Line: 178 char: 89 
18.
ERROR: +      $xml.Data.Hersteller | %{$tn = $rootNode.Nodes.Add($_.ID); $_.Program | %{$tn.Nodes.Add <<<< ($_.Name+" "+$_.Version)}} 
19.
ERROR:     + CategoryInfo          : InvalidOperation: (Add:String) [], RuntimeException 
20.
ERROR:     + FullyQualifiedErrorId : InvokeMethodOnNull 
21.
ERROR:
Wieso benutzt du im hinteren Teil $_. und vorn direk $?

Gruß
Bitte warten ..
Mitglied: colinardo
02.07.2014, aktualisiert um 13:36 Uhr
Zitat von H41mSh1C0R:
schonmal danke, leider will das noch nicht so:
geht hier einwandfrei mit deinem XML-Schnippsel:

DEMO:
01.
#Generated Form Function 
02.
function GenerateForm { 
03.
 
04.
#region Import the Assemblies 
05.
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null 
06.
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null 
07.
#endregion 
08.
 
09.
#region Generated Form Objects 
10.
$form1 = New-Object System.Windows.Forms.Form 
11.
$treeView1 = New-Object System.Windows.Forms.TreeView 
12.
$btnLoadXML = New-Object System.Windows.Forms.Button 
13.
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState 
14.
#endregion Generated Form Objects 
15.
 
16.
#---------------------------------------------- 
17.
#Generated Event Script Blocks 
18.
#---------------------------------------------- 
19.
 
20.
$rawXML = @" 
21.
<Data> 
22.
 <Hersteller ID="Adobe"> 
23.
  <Program> 
24.
    <Name>Adobe Reader</Name> 
25.
    <Version>11</Version> 
26.
  </Program> 
27.
  <Program> 
28.
   <Name>Adobe Professional</Name> 
29.
   <Version>7</Version> 
30.
  </Program> 
31.
 </Hersteller> 
32.
 <Hersteller ID="Microsoft"> 
33.
  <Program> 
34.
    <Name>Visual Studio</Name> 
35.
    <Version>11</Version> 
36.
  </Program> 
37.
  <Program> 
38.
   <Name>Office</Name> 
39.
   <Version>2013</Version> 
40.
  </Program> 
41.
 </Hersteller> 
42.
</Data> 
43.
"@ 
44.
 
45.
$handler_btnLoadXML_Click=  
46.
47.
    $treeView1.Nodes.Clear() 
48.
    $xml = new-object XML 
49.
    $xml.LoadXml($rawXML) 
50.
    $rootNode = $treeView1.Nodes.Add($xml.ChildNodes[0].Name) 
51.
    $xml.Data.Hersteller | %{$tn = $rootNode.Nodes.Add($_.ID); $_.Program | %{$tn.Nodes.Add($_.Name+" "+$_.Version)}} 
52.
 
53.
54.
 
55.
 
56.
$OnLoadForm_StateCorrection= 
57.
{#Correct the initial state of the form to prevent the .Net maximized form issue 
58.
	$form1.WindowState = $InitialFormWindowState 
59.
60.
 
61.
#---------------------------------------------- 
62.
#region Generated Form Code 
63.
$System_Drawing_Size = New-Object System.Drawing.Size 
64.
$System_Drawing_Size.Height = 217 
65.
$System_Drawing_Size.Width = 222 
66.
$form1.ClientSize = $System_Drawing_Size 
67.
$form1.DataBindings.DefaultDataSourceUpdateMode = 0 
68.
$form1.Name = "form1" 
69.
$form1.Text = "XML to TreeView" 
70.
 
71.
$treeView1.Anchor = 15 
72.
$treeView1.DataBindings.DefaultDataSourceUpdateMode = 0 
73.
$System_Drawing_Point = New-Object System.Drawing.Point 
74.
$System_Drawing_Point.X = 12 
75.
$System_Drawing_Point.Y = 41 
76.
$treeView1.Location = $System_Drawing_Point 
77.
$treeView1.Name = "treeView1" 
78.
$System_Drawing_Size = New-Object System.Drawing.Size 
79.
$System_Drawing_Size.Height = 164 
80.
$System_Drawing_Size.Width = 198 
81.
$treeView1.Size = $System_Drawing_Size 
82.
$treeView1.TabIndex = 1 
83.
 
84.
$form1.Controls.Add($treeView1) 
85.
 
86.
$btnLoadXML.Anchor = 13 
87.
 
88.
$btnLoadXML.DataBindings.DefaultDataSourceUpdateMode = 0 
89.
 
90.
$System_Drawing_Point = New-Object System.Drawing.Point 
91.
$System_Drawing_Point.X = 12 
92.
$System_Drawing_Point.Y = 12 
93.
$btnLoadXML.Location = $System_Drawing_Point 
94.
$btnLoadXML.Name = "btnLoadXML" 
95.
$System_Drawing_Size = New-Object System.Drawing.Size 
96.
$System_Drawing_Size.Height = 23 
97.
$System_Drawing_Size.Width = 198 
98.
$btnLoadXML.Size = $System_Drawing_Size 
99.
$btnLoadXML.TabIndex = 0 
100.
$btnLoadXML.Text = "XML parsen" 
101.
$btnLoadXML.UseVisualStyleBackColor = $True 
102.
$btnLoadXML.add_Click($handler_btnLoadXML_Click) 
103.
$form1.Controls.Add($btnLoadXML) 
104.
 
105.
#Save the initial state of the form 
106.
$InitialFormWindowState = $form1.WindowState 
107.
#Init the OnLoad event to correct the initial state of the form 
108.
$form1.add_Load($OnLoadForm_StateCorrection) 
109.
#Show the Form 
110.
$form1.ShowDialog()| Out-Null 
111.
 
112.
} #End Function 
113.
 
114.
#Call the Function 
115.
GenerateForm
Bitte warten ..
Mitglied: H41mSh1C0R
02.07.2014 um 13:53 Uhr
Hab jetzt mal deine Demo copy pasted und bekomme den gleichen Fehler. hmmmm
Bitte warten ..
Mitglied: colinardo
02.07.2014, aktualisiert um 13:54 Uhr
Powershell Updaten !! Mind. PS3.0

Geht hier einwandfrei...
Bitte warten ..
Mitglied: H41mSh1C0R
02.07.2014 um 14:11 Uhr
Ahhh danke, geht. =)

Die PS ist bereits auf der 4, aber das Powershell Studio was ich hier zur Verfügung habe kann maximal PS2. *gg*
Der PS3 Support ist in der Version auch noch deaktiviert.

Also solange immer zwischen ISE und Studio hin und her.

Nochmals danke Uwe.
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst Seriennummer Mainboard mit PowerShell auslesen (4)

Frage von 112Timo zum Thema Batch & Shell ...

Batch & Shell
gelöst BATCH Element aus XML-File auslesen (9)

Frage von pappkamerad zum Thema Batch & Shell ...

VB for Applications
Excel VBA XML-Nodes auslesen (4)

Frage von chef1568 zum Thema VB for Applications ...

PHP
gelöst Externe XML-Datei in PHP auslesen (18)

Frage von Akrosh zum Thema PHP ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (10)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...