XML导入TREEVIEW'打开
Private Sub btnOpen_Click()
    '打开文件选择窗体
    CommonDialog1.Filter = "*.xml|*.xml"
    CommonDialog1.FilterIndex = 2
    CommonDialog1.ShowOpen
    LoadTreeView (CommonDialog1.FileName)
End Sub
Sub LoadTreeView(ByVal ipath As String)
    
    If ipath = "" Then
        Exit Sub
    Else
        path = ipath
    End If
    
    Dim objDOM As DOMDocument
    Set objDOM = New DOMDocument
    '加载XML文件
    Call objDOM.Load(path)
    'Call objDom.loadXML("<Doc><Node1></Node1><Node2><ChildNode/></Node2></Doc>")
    
    '清空树
    TreeView1.Nodes.Clear
    cmbURL.Text = path
    frmMain.Caption = title & " - " & path
    
    '给COMBOX增加打开文档的历史记录
    Dim flag As Boolean
    flag = True
    Dim i
    For i = 0 To cmbURL.ListCount - 1
        If cmbURL.List(i) = path Then
            flag = False
            Exit For
        End If
    Next
    If flag Then
        cmbURL.AddItem path, cmbURL.ListCount
    End If
    
    Call XmlToTree(objDOM.documentElement, Nothing)
    Set objDOM = Nothing
End Sub'从xml导入到树
Sub XmlToTree(ByRef XMLNode As IXMLDOMNode, ByRef TreeNode As Node)
    
    Dim objNode As Node
    Dim xmlNodeList As IXMLDOMNodeList
    Dim lngNodeIndex As Long
    
    On Error GoTo ERR_HANDLER
    
    
    If TreeNode Is Nothing Then
        Set objNode = TreeView1.Nodes.Add
    Else
        Set objNode = TreeView1.Nodes.Add(TreeNode, tvwChild)
    End If
    
    If XMLNode.nodeName = "#text" Then
         objNode.Text = XMLNode.nodeValue
    Else
          objNode.Text = XMLNode.nodeName
    End If
    
    '展开节点-True 关闭节点-False
    If TreeNode Is Nothing Then
        objNode.Expanded = True
    Else
        objNode.Expanded = False
    End If
    
    
    
    Set xmlNodeList = XMLNode.childNodes
    For lngNodeIndex = 0 To xmlNodeList.length - 1
        Call XmlToTree(xmlNodeList.Item(lngNodeIndex), objNode)
    Next
ERR_HANDLER:
    If Err.Number <> 0 Then
        MsgBox Err.Description
    End If
End SubTREEVIEW导出XML
'保存
Private Sub btnSave_Click()
    If MsgBox("确定保存数据?", vbYesNo, "请选择:") = vbYes Then
        Dim nd As Node
        
'         For Each nd In TreeView1.Nodes
'            MsgBox nd.Text & nd.Tag & nd.Key
'
'         Next
    Call LoadXML
        
    End If
End Sub
Sub LoadXML()
    
    Dim objDOM     As DOMDocument
    Dim root     As IXMLDOMElement
    Set objDOM = New DOMDocument
    Set root = objDOM.createElement(TreeView1.Nodes(1).Text)
    Set objDOM.documentElement = root
    Set root = Nothing
    
    objDOM.preserveWhiteSpace = True
    Call TreeToXml(TreeView1.Nodes(1), objDOM.documentElement, True)
    objDOM.save (path)
    Set objDOM = Nothing
End Sub'从树导出到xml
Private Sub TreeToXml(ByRef TreeNode As Node, ByRef XMLNode As IXMLDOMNode, ByVal flag As Boolean)
    If flag Then
    End If    Dim objNewNode As IXMLDOMNode
    Dim objDOM As DOMDocument
    Dim objChildNode As Node
    
    On Error GoTo ERR_HANDLER
   
    Set objDOM = XMLNode.ownerDocument
    If objDOM Is Nothing Then
        Set objDOM = XMLNode
    End If    '如果flag=true,不给DOM对象加载主节点,如果falg=false则正常处理
    If Not flag Then
        Set objNewNode = objDOM.createElement(TreeNode.Text)
        Call XMLNode.appendChild(objNewNode)
    Else
        Set objNewNode = objDOM.getElementsByTagName(TreeNode.Text)(0)
    '    Set objNewNode = objDOM.documentElement
    End If
    
    If TreeNode.Children > 0 Then
        Set objChildNode = TreeNode.Child
        Do Until objChildNode Is Nothing
            Call TreeToXml(objChildNode, objNewNode, False)
            Set objChildNode = objChildNode.Next
        Loop
    End If
    
ERR_HANDLER:
    If Err.Number <> 0 Then
        MsgBox Err.Description
    End If
End Sub我导入的XML格式是:
<?xml version="1.0" encoding="gb2312" ?>
<A>
<B>
<NODE1>sdsf</NODE1>
<NODE2>sdfsdf</NODE2>
<NODE3>sdfsdf</NODE3>
<NODE4>sdfdsf</NODE4>
<NODE5>asdasd</NODE5>
<NODE6>fgfhfgh</NODE6>
</B>
<C>
<NODE1>asd</NODE1>
<NODE2>asd</NODE2>
<NODE3>teaxt</NODE3>
<NODE4>dggg</NODE4>
<NODE5>teaxt</NODE5>
<NODE6>F4234</NODE6>
</C>
</A>导出的XML格式是:<A><B><NODE1><AAA/></NODE1><NODE2><sdfsdf/></NODE2><NODE3><sdfsdf/></NODE3><NODE4><sdfdsf/></NODE4><NODE5><asdasd/></NODE5><NODE6><fgfhfgh/></NODE6></B><C><NODE1><asd/></NODE1><NODE2><asd/></NODE2><NODE3><teaxt/></NODE3><NODE4><dggg/></NODE4><NODE5><teaxt/></NODE5><NODE6><F4234/></NODE6></C></A>
问题:
1.暂且不说没有回车换行了,我现在想保存成导入前的保存格式(<NODE2><sdfsdf/></NODE2>-><NODE2>sdfsdf</NODE2>),请问这个要怎么做呢?
是要设置DOM对象的什么格式吗?
2.并且如果元素的值=纯数字的话会报错,比如<NODE2>123231</NODE2>,在导入的时候会报错,请问是设置的问题还是哪的问题呢?
3.如果要加入回车换行,请问要怎么做?
谢谢关注我的问题,告诉我思路也可以,告诉我做法也可以,探讨下也可以,谢谢了。

解决方案 »

  1.   

    要 Microsoft XML 3.0,下面的 MSDN 中有例子
    http://msdn.microsoft.com/en-us/library/ms759129
      

  2.   

    sdsf 导出来成 <sdsf/> 是因为节点的类型有文本节点、普通节点、注释节点等,而出现这种情况就是因为吧文本节点当普通节点处理了,所以判断下该节点是注释?文本?还是普通节点就可以解决。
    没有回车的处理方法是,当从treeview导入xmldomcument的时候根据节点判断是否该在该节点前或后插入回车节点(普通节点,内容为回车)来控制输出的格式。
      

  3.   

    这东西还是得自己多琢磨琢磨多试试,copy别人的代码学的东西不多,结贴了