xml文件的读取 并在Treeview控件上显示

时间:2021-12-31 11:34:58
<?xml version="1.0" standalone="yes"?>
<WAWA>
  <list>
    <group>好友</group>
    <friend>A001</friend>
  </list>
 <list>
    <group>好友</group>
    <friend>A002</friend>
  </list>
  <list>
    <group>陌生人</group>
    <friend>B001</friend>
  </list>
<list>
    <group>陌生人</group>
    <friend>B002</friend>
  </list>
  <list>
    <group>黑名单</group>
    <friend>C001</friend>
  </list>
<list>
    <group>黑名单</group>
    <friend>C002</friend>
  </list>
<list>
    <group>朋友</group>
    <friend>D001</friend>
  </list>
  <list>
    <group>朋友</group>
    <friend>D002</friend>
  </list>
</WAWA>

这是一个XML文件的内容 我想读取XML上的数据并在treeview控件上面显示下面的效果
由于我水平有限,希望大家帮帮忙。


|————好友
|          |——A001
|          |——A002
|
|————陌生人
|          |——B001
|          |——B002
|
|————黑名单
|          |——C001
|          |——C002
|
|————朋友
|          |——D001
|          |——D002
|










23 个解决方案

#1


容易
需要知识
xml解析 
dataset.readxml
xmldocument.read
xmlreader

树节点添加
treeview1.nodes.add();

#2


我发表的资源,有源码,可以运行的
:http://download.csdn.net/source/228583#aa

#3


zhchg6666()   可以说具体点吗

#4


lianshaohua(永远深爱一个叫“...”的好女孩儿!) 

你的我也去下来看了  也尝试过拉  
但像我上面给出的XML格式的你的也读不出来

#5


1.先读取出xml文件存放到dataTable中
StreamReader str=new StreamReader("~/tree.xml");
XmlDataDocument document=new XmlDataDocument();
document.DataSet.ReadXml(str);
DataTable dt=document.DataSet.Tables[0];
2.使用递归,读取出第一个节点

#6


xml操作完整类

Public Class Xml_Cls

    Private XmlDoc As XmlDocument
    Private XmlFile As String

    Public ReadOnly Property XmlFileName() As String
        Get
            Return XmlFile
        End Get
    End Property

    Public ReadOnly Property XmlText() As String
        Get
            Return XmlDoc.InnerXml
        End Get
    End Property

    Sub New(ByVal FileName As String, Optional ByVal CreateNew As Boolean = True, Optional ByVal Root As String = "XML", Optional ByRef IsOK As Boolean = False)
        IsOK = False
        XmlFile = ""
        Dim reader As System.Xml.XmlReader = Nothing
        Try
            reader = New System.Xml.XmlTextReader(FileName)
            reader.Read()
        Catch ex As Exception
            If reader IsNot Nothing Then reader.Close()
            Debug.Print("New - " & ex.Message)
            If Not Create(FileName, Root) Then Return
        Finally
            If reader IsNot Nothing Then reader.Close()
        End Try

        IsOK = True
        XmlFile = FileName
        XmlDoc = New XmlDocument
        XmlDoc.Load(XmlFile)
    End Sub

    Public Function Create(ByVal FileName As String, Optional ByVal Root As String = "XML") As Boolean
        Dim NewXML As XmlTextWriter = Nothing
        Try
            NewXML = New XmlTextWriter(FileName, Nothing)
            NewXML.Formatting = Formatting.Indented
            NewXML.WriteStartDocument()
            NewXML.WriteComment(My.Application.Info.AssemblyName & " Settings")
            NewXML.WriteStartElement(Root)
            NewXML.WriteAttributeString("Powered", "Null")
            NewXML.WriteEndElement()
            NewXML.WriteEndDocument()
            NewXML.Flush()
            NewXML.Close()
        Catch ex As Exception
            Debug.Print("Create - " & ex.Message)
            Return False
        Finally
            If NewXML IsNot Nothing Then
                NewXML.Close()
                NewXML = Nothing
            End If
        End Try
        Return True
    End Function

    Public Function Save(ByVal aSection As String, ByVal aKey As String, ByVal aValue As String) As Boolean
        Dim Paths() As String
        Dim n As Integer
        Dim Node, Node2 As XmlNode
        Dim Ele As XmlElement

        While Strings.Left(aSection, 1) = "/"
            aSection = Strings.Mid(aSection, 2)
        End While

        '段名是否为空        
        If aSection = "" Then
            XmlDoc.DocumentElement.RemoveAll()
        Else
            Paths = Strings.Split(aSection, "/")
            Try
                Node = XmlDoc.DocumentElement.SelectSingleNode(Paths(n))
                If Node Is Nothing Then
                    Ele = XmlDoc.CreateElement(Paths(n))
                    Node = XmlDoc.DocumentElement.AppendChild(Ele)
                End If
                For n = 1 To Paths.Length - 1
                    If Paths(n) = "" Then Continue For
                    Node2 = Node.SelectSingleNode(Paths(n))
                    If Node2 Is Nothing Then
                        Ele = XmlDoc.CreateElement(Paths(n))
                        Node2 = Node.AppendChild(Ele)
                    End If
                    Node = Node2
                Next
                '键名是否为空                
                If aKey = "" Then
                    Node.RemoveAll()
                Else
                    Ele = Node.Item(aKey)
                    If Ele Is Nothing Then
                        Ele = XmlDoc.CreateElement(aKey)
                        Node.AppendChild(Ele)
                    End If
                    '值是否为空                    
                    If aValue = "" Then
                        Node.RemoveChild(Ele)
                    Else
                        Ele.InnerText = aValue
                    End If
                End If
            Catch ex As Exception
                Debug.Print(ex.Message)
                Return False
            End Try
        End If
        XmlDoc.Save(XmlFile)
        Return True
    End Function

    Public Function Read(ByVal aSection As String, ByVal aKey As String, Optional ByVal aDefaultValue As String = "") As String
        Dim Node As XmlNode
        Node = XmlDoc.DocumentElement.SelectSingleNode(aSection & "/" & aKey)
        If Node Is Nothing Then Return aDefaultValue
        Return Node.InnerText
    End Function

End Class

#7


zhanglei5415()  

顺便把在Treeview上显示的递归方法
也帮我好拉
我太菜拉。

#8


wzuomin() 

这个我不太想用  看起来不是很好,而且是VB。NET的

#9


大虾~`~帮下忙呀   急…………

#10


DataSet ds=new DataSet();
ds.ReadXml(strXml);
foreach(DataRow r in ds.Tables[0].Rows)
{
tree.Nodes.Add(r[0]);
DataRow[] rows=ds.Tables[0].Select("group='"+r[0]+"'");
foreach(DataRow row in rows)
tree.Nodes[tree.Nodes.Count-1].Nodes.Add(row[1]);
}

#11


sq_zhuyi(老婆有了,缺个房子)
我试了一下你的方法
tree.Nodes.Add(r[0]);和tree.Nodes[tree.Nodes.Count-1].Nodes.Add(row[1]);

中的r[0]和r[1]提示错误无法转换成String类型。
不知道如何解决
大家帮看下

#12


郁闷~ r[0].ToString()

#13


sq_zhuyi(老婆有了,缺个房子)

r[0].ToString()

这个也试过了哦

#14


你没发出来的时候我都尝试拉  
大哥 留下 你QQ可以吗
我想问清楚点你

#15


<?xml version="1.0" standalone="yes"?>
<WAWA>
  <dep>
    <deptid>1</deptid>
    <deptdesc>好友</deptdesc>
  </dep>
  <dep>
    <deptid>2</deptid>
    <deptdesc>陌生人</deptdesc>
  </dep>
  <emp>
    <empdesc>张三</empdesc>
    <emp_dept_id>1</emp_dept_id>
  </emp>
  <emp>
    <empdesc>李林</empdesc>
    <emp_dept_id>1</emp_dept_id>
  </emp>
  <emp>
    <empdesc>张科</empdesc>
    <emp_dept_id>2</emp_dept_id>
  </emp>
</WAWA>

我只想读上面的XML格式的XML文件,读成以下的效果
|————好友
|          |——张三
|          |——李林
|
|————陌生人
|          |——张科
|          |——



上面那些大虾发那些都是正确的,但读我上面格式的XML文件都有错误 
大家帮我!


#16


路过 帮顶

#17


<?xml version="1.0" standalone="yes"?>
<WAWA>
  <dep>
    <deptid>1</deptid>
    <deptdesc>好友</deptdesc>
  </dep>
  <dep>
    <deptid>2</deptid>
    <deptdesc>陌生人</deptdesc>
  </dep>
  <emp>
    <empdesc>张三</empdesc>
    <emp_dept_id>1</emp_dept_id>
  </emp>
  <emp>
    <empdesc>李林</empdesc>
    <emp_dept_id>1</emp_dept_id>
  </emp>
  <emp>
    <empdesc>张科</empdesc>
    <emp_dept_id>2</emp_dept_id>
  </emp>
</WAWA>

上面的XML文件是 一个数据库生成的
表一dep
deptid        deptdesc
   1            好友
   2           陌生人

表二emp

empdesc    emp_dept_id
 张三            1
 李林            1
 张科            2



大家帮帮呀 急需解决

#18


帮你顶一下,如果懂得xml的读写的话这问题应该不大.
但我觉得这不是一个好的解决方法.(如果是做类似qq的好友分类功能的话)
xml可以这样:
<node>
  <type name="好友">
    <friend>张三</friend>
    <friend>李四</friend>
  </type>
  <type name="黑名单">
    <friend>王五</friend>
    <friend>张科</friend>
  </type>
  ……
</node>

这样程序的遍历只在有好友添加等操作时执行。而在读取好友列表时直接交给treeview就行了。这样我想执行程序的效率会高点~对于xml文件的操作也简单很多。

#19


E_wait() 
谢谢 我想跟了聊下 给你QQ我

#20


32486802

#21


楼上大哥 
你的XML文件怎么读呀

问题还没解决 大家帮下忙 
谢谢

#22



#23


问题自己解决

#1


容易
需要知识
xml解析 
dataset.readxml
xmldocument.read
xmlreader

树节点添加
treeview1.nodes.add();

#2


我发表的资源,有源码,可以运行的
:http://download.csdn.net/source/228583#aa

#3


zhchg6666()   可以说具体点吗

#4


lianshaohua(永远深爱一个叫“...”的好女孩儿!) 

你的我也去下来看了  也尝试过拉  
但像我上面给出的XML格式的你的也读不出来

#5


1.先读取出xml文件存放到dataTable中
StreamReader str=new StreamReader("~/tree.xml");
XmlDataDocument document=new XmlDataDocument();
document.DataSet.ReadXml(str);
DataTable dt=document.DataSet.Tables[0];
2.使用递归,读取出第一个节点

#6


xml操作完整类

Public Class Xml_Cls

    Private XmlDoc As XmlDocument
    Private XmlFile As String

    Public ReadOnly Property XmlFileName() As String
        Get
            Return XmlFile
        End Get
    End Property

    Public ReadOnly Property XmlText() As String
        Get
            Return XmlDoc.InnerXml
        End Get
    End Property

    Sub New(ByVal FileName As String, Optional ByVal CreateNew As Boolean = True, Optional ByVal Root As String = "XML", Optional ByRef IsOK As Boolean = False)
        IsOK = False
        XmlFile = ""
        Dim reader As System.Xml.XmlReader = Nothing
        Try
            reader = New System.Xml.XmlTextReader(FileName)
            reader.Read()
        Catch ex As Exception
            If reader IsNot Nothing Then reader.Close()
            Debug.Print("New - " & ex.Message)
            If Not Create(FileName, Root) Then Return
        Finally
            If reader IsNot Nothing Then reader.Close()
        End Try

        IsOK = True
        XmlFile = FileName
        XmlDoc = New XmlDocument
        XmlDoc.Load(XmlFile)
    End Sub

    Public Function Create(ByVal FileName As String, Optional ByVal Root As String = "XML") As Boolean
        Dim NewXML As XmlTextWriter = Nothing
        Try
            NewXML = New XmlTextWriter(FileName, Nothing)
            NewXML.Formatting = Formatting.Indented
            NewXML.WriteStartDocument()
            NewXML.WriteComment(My.Application.Info.AssemblyName & " Settings")
            NewXML.WriteStartElement(Root)
            NewXML.WriteAttributeString("Powered", "Null")
            NewXML.WriteEndElement()
            NewXML.WriteEndDocument()
            NewXML.Flush()
            NewXML.Close()
        Catch ex As Exception
            Debug.Print("Create - " & ex.Message)
            Return False
        Finally
            If NewXML IsNot Nothing Then
                NewXML.Close()
                NewXML = Nothing
            End If
        End Try
        Return True
    End Function

    Public Function Save(ByVal aSection As String, ByVal aKey As String, ByVal aValue As String) As Boolean
        Dim Paths() As String
        Dim n As Integer
        Dim Node, Node2 As XmlNode
        Dim Ele As XmlElement

        While Strings.Left(aSection, 1) = "/"
            aSection = Strings.Mid(aSection, 2)
        End While

        '段名是否为空        
        If aSection = "" Then
            XmlDoc.DocumentElement.RemoveAll()
        Else
            Paths = Strings.Split(aSection, "/")
            Try
                Node = XmlDoc.DocumentElement.SelectSingleNode(Paths(n))
                If Node Is Nothing Then
                    Ele = XmlDoc.CreateElement(Paths(n))
                    Node = XmlDoc.DocumentElement.AppendChild(Ele)
                End If
                For n = 1 To Paths.Length - 1
                    If Paths(n) = "" Then Continue For
                    Node2 = Node.SelectSingleNode(Paths(n))
                    If Node2 Is Nothing Then
                        Ele = XmlDoc.CreateElement(Paths(n))
                        Node2 = Node.AppendChild(Ele)
                    End If
                    Node = Node2
                Next
                '键名是否为空                
                If aKey = "" Then
                    Node.RemoveAll()
                Else
                    Ele = Node.Item(aKey)
                    If Ele Is Nothing Then
                        Ele = XmlDoc.CreateElement(aKey)
                        Node.AppendChild(Ele)
                    End If
                    '值是否为空                    
                    If aValue = "" Then
                        Node.RemoveChild(Ele)
                    Else
                        Ele.InnerText = aValue
                    End If
                End If
            Catch ex As Exception
                Debug.Print(ex.Message)
                Return False
            End Try
        End If
        XmlDoc.Save(XmlFile)
        Return True
    End Function

    Public Function Read(ByVal aSection As String, ByVal aKey As String, Optional ByVal aDefaultValue As String = "") As String
        Dim Node As XmlNode
        Node = XmlDoc.DocumentElement.SelectSingleNode(aSection & "/" & aKey)
        If Node Is Nothing Then Return aDefaultValue
        Return Node.InnerText
    End Function

End Class

#7


zhanglei5415()  

顺便把在Treeview上显示的递归方法
也帮我好拉
我太菜拉。

#8


wzuomin() 

这个我不太想用  看起来不是很好,而且是VB。NET的

#9


大虾~`~帮下忙呀   急…………

#10


DataSet ds=new DataSet();
ds.ReadXml(strXml);
foreach(DataRow r in ds.Tables[0].Rows)
{
tree.Nodes.Add(r[0]);
DataRow[] rows=ds.Tables[0].Select("group='"+r[0]+"'");
foreach(DataRow row in rows)
tree.Nodes[tree.Nodes.Count-1].Nodes.Add(row[1]);
}

#11


sq_zhuyi(老婆有了,缺个房子)
我试了一下你的方法
tree.Nodes.Add(r[0]);和tree.Nodes[tree.Nodes.Count-1].Nodes.Add(row[1]);

中的r[0]和r[1]提示错误无法转换成String类型。
不知道如何解决
大家帮看下

#12


郁闷~ r[0].ToString()

#13


sq_zhuyi(老婆有了,缺个房子)

r[0].ToString()

这个也试过了哦

#14


你没发出来的时候我都尝试拉  
大哥 留下 你QQ可以吗
我想问清楚点你

#15


<?xml version="1.0" standalone="yes"?>
<WAWA>
  <dep>
    <deptid>1</deptid>
    <deptdesc>好友</deptdesc>
  </dep>
  <dep>
    <deptid>2</deptid>
    <deptdesc>陌生人</deptdesc>
  </dep>
  <emp>
    <empdesc>张三</empdesc>
    <emp_dept_id>1</emp_dept_id>
  </emp>
  <emp>
    <empdesc>李林</empdesc>
    <emp_dept_id>1</emp_dept_id>
  </emp>
  <emp>
    <empdesc>张科</empdesc>
    <emp_dept_id>2</emp_dept_id>
  </emp>
</WAWA>

我只想读上面的XML格式的XML文件,读成以下的效果
|————好友
|          |——张三
|          |——李林
|
|————陌生人
|          |——张科
|          |——



上面那些大虾发那些都是正确的,但读我上面格式的XML文件都有错误 
大家帮我!


#16


路过 帮顶

#17


<?xml version="1.0" standalone="yes"?>
<WAWA>
  <dep>
    <deptid>1</deptid>
    <deptdesc>好友</deptdesc>
  </dep>
  <dep>
    <deptid>2</deptid>
    <deptdesc>陌生人</deptdesc>
  </dep>
  <emp>
    <empdesc>张三</empdesc>
    <emp_dept_id>1</emp_dept_id>
  </emp>
  <emp>
    <empdesc>李林</empdesc>
    <emp_dept_id>1</emp_dept_id>
  </emp>
  <emp>
    <empdesc>张科</empdesc>
    <emp_dept_id>2</emp_dept_id>
  </emp>
</WAWA>

上面的XML文件是 一个数据库生成的
表一dep
deptid        deptdesc
   1            好友
   2           陌生人

表二emp

empdesc    emp_dept_id
 张三            1
 李林            1
 张科            2



大家帮帮呀 急需解决

#18


帮你顶一下,如果懂得xml的读写的话这问题应该不大.
但我觉得这不是一个好的解决方法.(如果是做类似qq的好友分类功能的话)
xml可以这样:
<node>
  <type name="好友">
    <friend>张三</friend>
    <friend>李四</friend>
  </type>
  <type name="黑名单">
    <friend>王五</friend>
    <friend>张科</friend>
  </type>
  ……
</node>

这样程序的遍历只在有好友添加等操作时执行。而在读取好友列表时直接交给treeview就行了。这样我想执行程序的效率会高点~对于xml文件的操作也简单很多。

#19


E_wait() 
谢谢 我想跟了聊下 给你QQ我

#20


32486802

#21


楼上大哥 
你的XML文件怎么读呀

问题还没解决 大家帮下忙 
谢谢

#22



#23


问题自己解决