Dim objXML As DOMDocument
Dim nXML As Node
Dim childnode As Node
Dim secondnode As Node
Public Sub EnumSubNode(ParentXMLNode As IXMLDOMNode, NodeGroup As Nodes, ParentNodeKey As String, EnumChild As Boolean)
Dim XMLNode As IXMLDOMNode
Dim XMLAttr As IXMLDOMAttributeDim NodX As NodeFor Each XMLNode In ParentXMLNode.childNodes
Set NodX = NodeGroup.Add(ParentNodeKey, tvwChild)
Set XMLAttr = XMLNode.Attributes.getNamedItem("RoomId")
NodX.Key = "RoomId" & XMLAttr.nodeValue
NodX.Tag = XMLAttr.nodeValue
Set XMLAttr = XMLNode.Attributes.getNamedItem("Title")
NodX.Text = XMLAttr.nodeValueIf EnumChild And XMLNode.hasChildNodes() Then
EnumSubNode XMLNode, NodeGroup, NodX.Key
End If
Next
End SubPublic Function ConstructXMLTree(XMLFile As DOMDocument, Tree As TreeView) As Boolean
Dim XMLRoot As IXMLDOMElement
Dim XMLNode As IXMLDOMNode
Dim XMLAttr As IXMLDOMAttribute
Dim NodX As Node
ConstructXMLTree = True
Set XMLRoot = XMLFile.documentElement
Set XMLNode = XMLRoot.selectSingleNode("Csdn/Forums/Room")
'Set XMLNode = XMLRoot.selectSingleNode("Room")
Set NodX = TreeView1.Nodes.Add
NodX.Key = "Root"
NodX.Tag = "Root"
Set XMLAttr = XMLNode.Attributes.getNamedItem("Title")
NodX.Text = XMLAttr.nodeValue
If XMLNode.hasChildNodes() Then
EnumSubNode XMLNode, TreeView1.Nodes, NodX.Key, True
End If
End Function
Private Sub Form_Load()Set objXML = New DOMDocument If Not objXML.Load("Config.xml") Then
MsgBox "不能读取Config.xml文件。"
Exit Sub
End If
ConstructXMLTree objXML, Me.TreeView1
End Sub==============Config.xml====================
<?xml version="1.0" encoding="gb2312" ?>
<Config>
<Csdn Title="中国软件" Url="http://www.csdn.net">
<Forums Title="专家门诊">
<Room Title="开发语言">
<Room Title="Visual C++/MFC" BigRoomId="50">
<Room Title="基础类" RoomId="5001"></Room>
<Room Title="非技术类" RoomId="5002"></Room>
<Room Title="界面" RoomId="5003"></Room>
<Room Title="网络编程" RoomId="5004"></Room>
<Room Title="进程/线程/DLL" RoomId="5005"></Room>
<Room Title="ATL/ActiveX/COM" RoomId="5006"></Room>
<Room Title="数据库" RoomId="5007"></Room>
<Room Title="硬件/系统" RoomId="5008"></Room>
<Room Title="HTML/XML" RoomId="5009"></Room>
<Room Title="图形处理/算法" RoomId="5010"></Room>
<Room Title="Visual C++ 资源" RoomId="5011"></Room>
</Room>
<Room Title="Visual Basic" BigRoomId="51">
<Room Title="基础类" RoomId="5101"></Room>
<Room Title="非技术区" RoomId="5102"></Room>
<Room Title="控件" RoomId="5103"></Room>
<Room Title="API" RoomId="5104"></Room>
<Room Title="数据库" RoomId="5105"></Room>
<Room Title="报表" RoomId="5106"></Room>
<Room Title="网络编程" RoomId="5107"></Room>
<Room Title="VBA" RoomId="5108"></Room>
<Room Title="EVB" RoomId="5109"></Room>
<Room Title="VB资源" RoomId="5110"></Room>
</Room>
</Room>
</Forums>
</Csdn>
</Config>
Dim nXML As Node
Dim childnode As Node
Dim secondnode As Node
Public Sub EnumSubNode(ParentXMLNode As IXMLDOMNode, NodeGroup As Nodes, ParentNodeKey As String, EnumChild As Boolean)
Dim XMLNode As IXMLDOMNode
Dim XMLAttr As IXMLDOMAttributeDim NodX As NodeFor Each XMLNode In ParentXMLNode.childNodes
Set NodX = NodeGroup.Add(ParentNodeKey, tvwChild)
Set XMLAttr = XMLNode.Attributes.getNamedItem("RoomId")
NodX.Key = "RoomId" & XMLAttr.nodeValue
NodX.Tag = XMLAttr.nodeValue
Set XMLAttr = XMLNode.Attributes.getNamedItem("Title")
NodX.Text = XMLAttr.nodeValueIf EnumChild And XMLNode.hasChildNodes() Then
EnumSubNode XMLNode, NodeGroup, NodX.Key
End If
Next
End SubPublic Function ConstructXMLTree(XMLFile As DOMDocument, Tree As TreeView) As Boolean
Dim XMLRoot As IXMLDOMElement
Dim XMLNode As IXMLDOMNode
Dim XMLAttr As IXMLDOMAttribute
Dim NodX As Node
ConstructXMLTree = True
Set XMLRoot = XMLFile.documentElement
Set XMLNode = XMLRoot.selectSingleNode("Csdn/Forums/Room")
'Set XMLNode = XMLRoot.selectSingleNode("Room")
Set NodX = TreeView1.Nodes.Add
NodX.Key = "Root"
NodX.Tag = "Root"
Set XMLAttr = XMLNode.Attributes.getNamedItem("Title")
NodX.Text = XMLAttr.nodeValue
If XMLNode.hasChildNodes() Then
EnumSubNode XMLNode, TreeView1.Nodes, NodX.Key, True
End If
End Function
Private Sub Form_Load()Set objXML = New DOMDocument If Not objXML.Load("Config.xml") Then
MsgBox "不能读取Config.xml文件。"
Exit Sub
End If
ConstructXMLTree objXML, Me.TreeView1
End Sub==============Config.xml====================
<?xml version="1.0" encoding="gb2312" ?>
<Config>
<Csdn Title="中国软件" Url="http://www.csdn.net">
<Forums Title="专家门诊">
<Room Title="开发语言">
<Room Title="Visual C++/MFC" BigRoomId="50">
<Room Title="基础类" RoomId="5001"></Room>
<Room Title="非技术类" RoomId="5002"></Room>
<Room Title="界面" RoomId="5003"></Room>
<Room Title="网络编程" RoomId="5004"></Room>
<Room Title="进程/线程/DLL" RoomId="5005"></Room>
<Room Title="ATL/ActiveX/COM" RoomId="5006"></Room>
<Room Title="数据库" RoomId="5007"></Room>
<Room Title="硬件/系统" RoomId="5008"></Room>
<Room Title="HTML/XML" RoomId="5009"></Room>
<Room Title="图形处理/算法" RoomId="5010"></Room>
<Room Title="Visual C++ 资源" RoomId="5011"></Room>
</Room>
<Room Title="Visual Basic" BigRoomId="51">
<Room Title="基础类" RoomId="5101"></Room>
<Room Title="非技术区" RoomId="5102"></Room>
<Room Title="控件" RoomId="5103"></Room>
<Room Title="API" RoomId="5104"></Room>
<Room Title="数据库" RoomId="5105"></Room>
<Room Title="报表" RoomId="5106"></Room>
<Room Title="网络编程" RoomId="5107"></Room>
<Room Title="VBA" RoomId="5108"></Room>
<Room Title="EVB" RoomId="5109"></Room>
<Room Title="VB资源" RoomId="5110"></Room>
</Room>
</Room>
</Forums>
</Csdn>
</Config>
'->
If Not objXML.Load(App.Path & "\Config.xml") Then
EnumSubNode XMLNode, NodeGroup, NodX.Key
'->
EnumSubNode XMLNode, NodeGroup, NodX.Key, True还有属性不存在的问题,看您怎么处理了.
NodX.Key = "RoomId" & XMLAttr.nodeValue
NodX.Tag = XMLAttr.nodeValue
但找到几个可以参考的外国纲站的例子和源码教程
http://www.informit.com/articles/article.aspx?p=25084源码
http://www.informit.com/content/images/art_stephens1_gettingstarted/elementLinks/SaveValuesIndented.zip
问题出在这句话上:
Set XMLAttr = XMLNode.Attributes.getNamedItem("RoomId")
你让我在黑夜中看到明灯!!
真心感谢!
不过如果属性自身不是单独节点的话,我记得应该是用其所在Element对象的getattribute/setattribute方法:)