Attribut von XML wird nicht gelesen

joshi123

Grünschnabel
Hallo,

leider habe ich im Forum nicht das richtige gefunden, bzw. konnte mit den Threads dann nichts anfangen um mein Problem zu lösen ;-|

Ich habe das Problem, dass mein VB-Code nicht alle Attribute von meiner XML ausliest.

Hier erst mal die Codes :
XML :
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Programme Path="1">
  <Feld Icon="Folder.ico" Path="2">Feld 1<VisualStudio Path="C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe" Icon="VS.png">Visual Studio</VisualStudio>
    <Excel Path="C:\Program Files\Microsoft Office 15\root\office15\EXCEL.EXE" Icon="Excel.png">Excel</Excel>
  </Feld>
  <Home Icon="Folder.ico" Path="3">Home Place<Notepad Path="C:\Program Files\Notepad++\notepad++.exe" Icon="notepad.png">Notepad ++</Notepad>
    <JaTool Path="C:\Program Files (x86)\Tool7\javaw.exe" Argumente="-splash:splash.png -cp ./cl/cl.jar; -Dawt.useSystemAAFontSettings=on" Icon="JaTool.ico" RunPath="C:\Program Files (x86)\Tool7\bin\..">JaTool</JaTool>
  </Home>
</Programme>

VB-Code :
Code:
Option Strict On
Imports System.Xml
Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions
Public Class treeViewLoadXml
    Dim imgLst As New ImageList
    Dim vImgPath(-1) As String, iv As Int32 = 0
    Private Sub treeViewLoadXml_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Load_XML()
    End Sub
    Public Sub Load_XML()
        Try
            ' Get Xml's file stream.
            imgLst.ImageSize = New Drawing.Size(30, 27)
            Dim vPath() As String = Split(Application.ExecutablePath, "\")
            vPath(vPath.Length - 1) = "XMLFile1.xml"
            Dim filepath As String = Join(vPath, "\")
            Dim _rstream As New FileStream(filepath, FileMode.Open)
            ' Load Xml document.
            '
            Dim dom As New XmlDocument()
            dom.Load(_rstream)
            _rstream.Close()
            ' Initialize treeView control.
            '
            TreeView1.BeginUpdate()
            TreeView1.Nodes.Clear()
            TreeView1.Nodes.Add(New TreeNode(dom.DocumentElement.Name))
            ' Populate the treeView with the dom nodes.
            '
            AddNode(dom.DocumentElement, TreeView1.Nodes(0))
            If CBool(iv) Then
                For i = 0 To iv - 1
                    imgLst.Images.Add(Image.FromFile(vImgPath(i)))
                Next
                TreeView1.ImageList = imgLst
            End If
            TreeView1.EndUpdate()
            'TreeView1.ExpandAll()
        Catch xmlEx As XmlException
            MessageBox.Show(xmlEx.Message)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    Private Sub AddNode(ByVal inXmlNode As XmlNode, ByVal inTreeNode As TreeNode)
        Dim i As Integer
        If inXmlNode.HasChildNodes Then
            Dim nodeList As XmlNodeList
            nodeList = inXmlNode.ChildNodes
            i = 0
            While i <= nodeList.Count - 1
                Dim xNode As XmlNode = inXmlNode.ChildNodes(i)
                Dim imgIndex As Int32 = -1
                Dim SelimgIndex As Int32 = -1
                If xNode.Attributes IsNot Nothing Then
                    For Each att As XmlAttribute In xNode.Attributes
                        If att.Name = "Icon" Then
                            imgIndex = addImage(att.Value)
                            SelimgIndex = addImage(att.Value)
                            Exit For
                        End If
                    Next
                End If
                Dim tNode As New TreeNode(xNode.Name)
                Dim bIsTxt As Boolean = False
                If tNode.Text = "#text" Then
                    tNode.Text = xNode.Value
                    bIsTxt = True
                End If
                If imgIndex <> -1 Then
                    tNode.ImageIndex = imgIndex
                End If
                If SelimgIndex <> -1 Then
                    tNode.SelectedImageIndex = SelimgIndex
                End If
                If bIsTxt Then
                    'inTreeNode.Text += " " + tNode.Text '
                    inTreeNode.Text = tNode.Text
                Else
                    inTreeNode.Nodes.Add(tNode)
                    AddNode(xNode, tNode)
                End If
                i += 1
            End While
            If inXmlNode.Attributes IsNot Nothing AndAlso inXmlNode.Attributes("Path") IsNot Nothing Then
                inTreeNode.Name = inXmlNode.Attributes("Path").Value
            End If
            If inXmlNode.Attributes IsNot Nothing AndAlso inXmlNode.Attributes("Argumente") IsNot Nothing Then
                inTreeNode.Name = inXmlNode.Attributes("Argumente").Value
            End If
            If inXmlNode.Attributes IsNot Nothing AndAlso inXmlNode.Attributes("RunPath") IsNot Nothing Then
                inTreeNode.Name = inXmlNode.Attributes("RunPath").Value
            End If
        End If
    End Sub
    Function addImage(path As String) As Int32
        Dim i As Int32 = Array.IndexOf(vImgPath, path)
        If i = -1 AndAlso IO.File.Exists(path) Then
            ReDim Preserve vImgPath(iv)
            Me.vImgPath(iv) = path
            i = iv
            iv += 1
        End If
        Return i
    End Function
    Private Sub TreeView1_NodeMouseDoubleClick(sender As Object, e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseDoubleClick
        Try
            Dim Path As String = TreeView1.SelectedNode.Name
            Dim Argumente As String = TreeView1.SelectedNode.Name
            Dim RunPath As String = TreeView1.SelectedNode.Name

            If IsNumeric(Path) Then
                Dim nAction As Int32 = Int32.Parse(Path)
                Select Case nAction
                    Case 1 'wenn was gemacht werden soll, wenn Path ist nur eine Zahl
                        ' do job for Path="1" ' 
                    Case 2
                        ' do job for Path="2" '
                    Case 3
                        ' do job for Path="3" '
                End Select
            Else
                Select Case e.Node.Text
                    Case "Visual Studio"
                        MsgBox("Visual Studio")
                        '...
                    Case "Excel"
                        MsgBox("Excel")
                        '...
                    Case "Notepad ++"
                        MsgBox("Notepad")
                        '...
                End Select
                If File.Exists(Path) Then
                    Process.Start(Path)
                    'Dim MyProcess As New Process()
                    'MyProcess.StartInfo.FileName = Path
                    'MyProcess.StartInfo.Arguments = Argumente
                    'MyProcess.Start()
                End If
            End If
        Catch ex As Exception
            MsgBox("kein Programm gefunden")
        End Try
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim Path As String = TreeView1.SelectedNode.Name
        Dim Argumente As String = TreeView1.SelectedNode.Name
        Dim RunPath As String = TreeView1.SelectedNode.Name
        Label1.Text = Path
        Label2.Text = Argumente
        Label3.Text = RunPath
       
    End Sub
End Class

Die XML wird soweit gelesen, dass jeder Knoten sein Icon bekommt ("Icon" welches als Attribut angegeben ist) und auch der Pfad (Path) zum starten des Programms wird gelesen. Jedoch werden die weiteren Attribute ("Argumente" und "RunPath") nicht mit eingelesen und können somit auch nicht von mir verwendet werden.

Ich komme einfach nicht weiter und hoffe das ihr mir hier weiterhelfen könnt!?!?
 
Setzt mal Breakpoint bei Argumente und RunPath ob dort reignesprungen wird.
Meine erste vermutung wäre erstmal das die Arguemnte richtig abgefragt werden aber da du mit dem gleichen inTreeNode Arbeitest und dort den Namen immer neu setzt, gewinnt das letzte Xml-Argumente das abgefragt wird.
Würd ich jetzt auf den ersten Blick vermuten.
 
Guter Tipp mit den Breakpoints.
Es ist tatsächlich so, dass es egal ist, ob ich die Attribute separat definiere (per "Dim Argumente As String = TreeView1.SelectedNode.Name"), es wird immer das letzte Attribut von dem Knoten ausgegeben.
Nun ist mein Latein zu Ende und ich komm nicht mehr weiter.
 
Ich hänge leider weiterhin fest. ich weiss nicht, wie ich diese Hilfsklasse nun in meinen Code einbauen soll, damit es so funktioniert, wie es soll ;-( dafür bin ich einfach noch ein Grünschnabel
 
Hilfsklasse:
Code:
class MeineKlasse
{
    public string EigenschaftA { get; set; }
    public string EigenschaftB { get; set; }
}

Werte zuweisen:
Code:
MeineKlasse mk = new MeineKlasse();
...
mk.EigenschaftA = inXmlNode.Attributes["Path"].Value;
...
mk.EigenschaftB = inXmlNode.Attributes["RunPath"].Value;
...
inTreeNode.Tag = mk;

Tag abfragen:
Code:
MeineKlasse mk = TreeView1.SelectedNode.Tag as MeineKlasse;
if (mk != null)
{
    ....
}

ist zwar C# aber vielleicht hilfts bissl
 
Komplett umwandeln und verstehen kann ich es leider nicht.
Mein Versuch :
Hilfsklasse
Code:
Public Class MeineKlasse
        Dim EigenschaftA As String
        Dim EigenschaftB As String
    End Class

bei Werte zuweisen und Tag abfragen kriselt es leider schon... Das was ich in VB übersetzen konnte, müsste folgendes sein :
Code:
mk.EigenschaftA = inXmlNode.Attributes("Path").Value
            ...
        mk.EigenschaftB = inXmlNode.Attributes("RunPath").Value


inTreeNode.Tag = mk

        MeineKlasse.mk = TreeView1.SelectedNode.Tag as MeineKlasse
        If mk IsNot Nothing Then
            '...
        End If
 
habe folgendes jetzt alles probiert.

Code:
Dim MeineKlasse MK As New MeineKlasse() = TryCast()
        inTreeNode.Tag = mk

        MeineKlasse.mk = TreeView1.SelectedNode.Tag as MeineKlasse

alles ohne Erfolg.

Danke für die Mühen, aber ich glaube ich muss das alles irgendwie doch ohne XML umsetzen ;-( Mir fehlen dazu einfach zu viele Kenntnisse.
Vielleicht kann noch wer mit VB.net noch helfen irgendwann!?
 
Zurück