这个示例演示如何用程序生成一个 XML 文件。点击按钮,程序会生成一个 XML 文件,存成 C:\new.xml,并同时将这个 XML 文件的内容显示在 TextBox 里。
创建项目 (Project) 和添加控件
打开 Visual Studio 2005。在文件 (File) 菜单上,单击新建项目 (New Project)。 在新建项目 (New Project) 对话框的模板 (Templates) 窗格中,单击 Windows 应用程序 (Windows Application)。在名称 (Name) 框中键入 CreateXml,再单击确定 (OK)。
在 Toolbox 里选中 Button 控件,将其拖到 Form1 上。在 Properties 窗口将该 Button 的 Name 属性改为 btnCreate,将其 Text 属性改为 Create an XML File。
在 Toolbox 里选中 TextBox 控件,将其拖到 Form1 上。在 Properties 窗口将该 TextBox 的 Name 属性改为 txtContent,将其 Multiline 属性改为 True。
如下图。
加入代码
双击 Create an XML File 的 Button,进入代码编辑窗口。添加代码如下:
Imports System.Xml
Public Class Form1
Private Sub btnCreate_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnCreate.Click
Dim xDoc As New XmlDocument
Dim xD As XmlDeclaration
Dim xComment As XmlComment
Dim xeRoot As XmlElement
Dim xeSiteName As XmlElement
xD = xDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing)
xDoc.AppendChild(xD)
xComment = xDoc.CreateComment("Site Information")
xDoc.AppendChild(xComment)
xeRoot = xDoc.CreateElement("Sites")
xDoc.AppendChild(xeRoot)
xeSiteName = xDoc.CreateElement("SiteName")
xeSiteName.InnerText = "www. B l a B l a. cn"
xeRoot.AppendChild(xeSiteName)
xDoc.Save("C:\new.xml")
Me.txtContent.Text = xDoc.OuterXml
End Sub
End Class
选择调试 (Debug) 菜单中的开始调试 (Start Debugging),运行该程序。或者直接按快捷键 F5 运行。
你会看到如下画面,同时在 C 盘根目录下,你会找到一个名为 new.xml 的文件。
提示
用 XmlDocument.CreateXmlDeclaration 这个方法,可以创建 XML 文件的声明。CreateXmlDeclaration 的三个参数依次表示 version, encoding 和 standalone。
用 AppendChild 方法,能够为选中节点增加一个子节点,增加的子节点的位置排在选中节点所有子节点的最后。
用 XmlDocument.CreateComment 方法,可以创建 XML 文件里的注释。
用 CreateElement 方法,可以创建一个 XML 元素 (Element)。
用 XmlElement.InnerText 属性,可以设置或者得到某个节点的内部文本,包括该节点包含的文本,以及该节点的子节点。
用 OuterXml 这个属性,可以得到 XML 文件的内容。
VB操作DOM生成XML
无论是通过生成具体的XML文件,还是动态的XML数据流,只要按照XML的格式输出相关XML节点和值就可以了,这样看来XML似乎很简单。但这并没有真正接触到XML的操作。在我们看来,这些XML无非就是一些成对的标签和相关字符组成的数据记录,毫无生命力可言。然而事实上,通过XMLDOM来操作XML则显示了XML的绝对优势(这点在生成XML时优势不明显,却在添加、删除XML节点时体验无限)。
使用XMLDOM创建XML文档,可使用Save方法生成XML文档,使用createElement方法创建XML元素、createNode创建节点,其实对于XML中的任何标签的创建都可以任意选择其中的一种,不过一般使用createElement创建顶层(根)元素,使用createNode创建子节点(元素),当然createElement和createNode的使用方法也是不同。
<%
Set objXMLdoc = CreateObject("Microsoft.XMLDOM")
Set world=objXMLdoc.createElement("世界")
objXMLdoc.appendChild(world)
Set hello=objXMLdoc.createNode("element", "你好", "")
hello.Text = "hello,world"
objXMLdoc.documentElement.appendChild(hello)
objXMLdoc.Save Server.MapPath("test2.xml")
Set objXMLdoc = Nothing
%>
CreateObject("Microsoft.XMLDOM") 声明使用XMLDOM对象
在元素或节点被建立(createElement、createNode)时,其并没有加到文件树中,若要将节点加到文件树中,则需要插入,如appendChild。
xmlDocument.createNode(type, name, nameSpaceURI) 表示建立一个指定型态、名称,及命名空间的新节点
type 用来确认要被建立的节点型态,name 是一个字符串来确认新节点的名称,命名空间的前缀则是选择性的。nameSpaceURI 是一个定义命名空间URI 的字符串。如果前缀被包含在名称参数中,此节点会在nameSpaceURI 的内文中以指定的前缀建立。如果不包含前缀,指定的命名空间会被视为预设的命名空间。
objXMLdoc.createNode("element", "你好", "") 等同于 objXMLdoc.createElement("你好")
4,objXMLdoc.documentElement.appendChild(hello)其实就是XML文档根元素下建立节点,在本例中等同于 world.appendChild(hello),world为本例中的节点名,以此类推。
所以可以这样来写:
<%
Set objXMLdoc = CreateObject("Microsoft.XMLDOM")
Set world=objXMLdoc.createElement("世界")
objXMLdoc.appendChild(world)
Set hello=objXMLdoc.createElement("你好")
hello.Text = "hello,world"
world.appendChild(hello)
objXMLdoc.Save Server.MapPath("test2.xml")
Set objXMLdoc = Nothing
%>
需要注意的是,通过XMLDOM生成的XML文件都是UTF-8格式的,这对我们所有应用程序文件的UTF-8化作了很好的推介。
总结
生成XML数据,可以使用FSO,如FSO被禁用,可使用XMLDOM,当然还可以直接使用动态文档。不过如果融会贯通地掌握XML的操作,XMLDOM操作是必须的。
Option Explicit
Public Rs As New ADODB.Recordset
Public Conn As New ADODB.Connection
Public tempDoc As MSXML2.DOMDocument 'xml文件
Public tempNode As MSXML2.IXMLDOMNode
Public Root As MSXML2.IXMLDOMElement
Public tempelement As MSXML2.IXMLDOMElement
Public tempattribute As MSXML2.IXMLDOMElement
Public emp As MSXML2.IXMLDOMElement
Private Sub Command1_Click()
'生成一个XML DOMDocument对象
Set tempDoc = New MSXML2.DOMDocument
'生成根节点并把它设置为文件的根
Set Root = tempDoc.createElement("employees")
Set tempDoc.documentElement = Root
'在节点上添加多个属性
Call Root.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema")
Call Root.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")
Call Root.setAttribute("xmlns", "http://www.kingdee.com/ReK3Inventory")
Do While Not Rs.EOF
Set emp = tempDoc.createNode(MSXML2.NODE_ELEMENT, "employee", "")
Root.appendChild emp
'生成孩子节点添加到根节点上去,并且为这个节点设置一个属性
Set tempNode = tempDoc.createNode(MSXML2.NODE_ELEMENT, "Employeeid", "")
tempNode.Text = Rs(0)
emp.appendChild tempNode
Set tempNode = tempDoc.createNode(MSXML2.NODE_ELEMENT, "Firstname", "")
tempNode.Text = Rs(1)
emp.appendChild tempNode
Set tempNode = tempDoc.createNode(MSXML2.NODE_ELEMENT, "Title", "")
tempNode.Text = Rs(2)
emp.appendChild tempNode
Rs.MoveNext
Loop
Dim pi As IXMLDOMProcessingInstruction
Set pi = tempDoc.createProcessingInstruction("xml", "version='1.0' encoding='gb2312'")
Call tempDoc.insertBefore(pi, tempDoc.childNodes(0))
'直接保存成文件即可
tempDoc.Save "c:\myTest.xml"
Unload Me
End Sub
Private Sub Form_Load()
Dim strConn As String
strConn = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=LocalHost"
Conn.CursorLocation = adUseClient
Conn.Open strConn
If Rs.State <> adStateClosed Then Rs.Close
Rs.Open "Select employeeid,Firstname,Title from employees ", Conn, adOpenStatic, adLockOptimistic
End Sub
Dim oFso As New FileSystemObject
Dim oFile As Object
Dim xmlDoc As MSXML2.DOMDocument
nowDate = CStr(Year(Date)) & CStr(Month(Date)) & CStr(Day(Date))
ePath = expPath.Text + "/" + nowDate
Set xmlDoc = New MSXML2.DOMDocument
xmlDoc.validateOnParse = False
xmlDoc.async = False
Set oFso = CreateObject("scripting.filesystemobject")
If oFso.FileExists(ePath + ".xml") Then
oFso.DeleteFile ePath + ".xml"
End If
Set oFile = oFso.OpenTextFile(ePath + ".xml", 8, True)
Dim str As String
str = "select ajbh from gab_mala where ifexp is null or ifexp=''"
oRs.Open str, oConn, 1, 1
Do While Not oRs.EOF
tempzdaj = "<zdaj:record ajbh='" + oRs("ajbh") + "'><ma><la>"
oFile.WriteLine (tempzdaj)
'基本信息
str = "select xckybh,ladwdm,ladwxc,ajlb1,ajlb2,ajlb3,ajxz1,larq,swrs,ssrs,fxdz,fxdzxz,fxcs,fxbw,zwyw,dnayw,"
str = str + "zjyw,xdhwyw,gj,gjhj,qthjwz,bjwp,zasjsx,zasjxx,fxzarscz,fxzarszz,zagj,qhdx,srcs,qrfs,jcfs,srfs,"
str = str + "wzmj,tlfs,zasdtdms,aqms,zayy,lcfzyj,zazzhzbzcy,lxdh,xsjsfzr,gajgfzr,tbr,tbrq from gab_mala where ajbh='" & oRs("ajbh") & "'"
oRsTemp.Open str, oConn, 1, 1
Do While Not oRsTemp.EOF
Set root = xmlDoc.createNode(1, "jbxx", "")
Set temp = xmlDoc.appendChild(root)
Set onode = xmlDoc.createNode("element", "rec", "")
Set temp = root.appendChild(onode)
For i = 0 To oRsTemp.Fields.Count - 1
Set child = xmlDoc.createNode("element", oRsTemp.Fields(i).Name, "")
If Not IsNull(oRsTemp.Fields(i)) Then
If oRsTemp.Fields(i).Name = UCase("fxcs") Or oRsTemp.Fields(i).Name = UCase("fxbw") Or oRsTemp.Fields(i).Name = UCase("zagj") Or oRsTemp.Fields(i).Name = UCase("qhdx") Or oRsTemp.Fields(i).Name = UCase("srcs") Or oRsTemp.Fields(i).Name = UCase("qrfs") Or oRsTemp.Fields(i).Name = UCase("jcfs") Or oRsTemp.Fields(i).Name = UCase("srfs") Or oRsTemp.Fields(i).Name = UCase("wzmj") Or oRsTemp.Fields(i).Name = UCase("zayy") Then
child.Text = CL(oRsTemp.Fields(i))
Else
child.Text = oRsTemp.Fields(i)
End If
Else
child.Text = ""
End If
Set temp = onode.appendChild(child)
Next
rstoxml = root.xmloFile.WriteLine (rstoxml)
xmlDoc.removeChild (root)
oRsTemp.MoveNext
Loop
oRsTemp.Close'人员
str = "select manid from caseman where caseno='" & oRs("ajbh") & "'"
oRs1.Open str, oConn, 1, 1
If oRs1.RecordCount > 0 Then
Set root = xmlDoc.createNode(1, "xyry", "")
Set temp = xmlDoc.appendChild(root)
End If
Do While Not oRs1.EOF
str = "select ztrybh,name as xm,othername as bmhch,sex as xb,birthday as csrqsx,birthday as csrqxx,jzd as hjd,ABODEADDR as hjdxz,STATURE as sgsx,STATURE as sgxx,ACCENT as ky,BODYSHAPE as tmtz,FACESHAPE as tbbj,'' as qttz,SPEC as zc,CARDID as sfzh,'' as qtzjmc,'' as qtzjhm,'' as zp from smaninfo"
str = str + " where manid='" & oRs1("manid") & "'"
oRsTemp.Open str, oConn, 1, 1
Do While Not oRsTemp.EOF
Set onode = xmlDoc.createNode("element", "rec", "")
Set temp = root.appendChild(onode)
For i = 0 To oRsTemp.Fields.Count - 1
Set child = xmlDoc.createNode("element", oRsTemp.Fields(i).Name, "")
If Not IsNull(oRsTemp.Fields(i)) Then
If oRsTemp.Fields(i).Name = UCase("ky") Or oRsTemp.Fields(i).Name = UCase("tmtz") Or oRsTemp.Fields(i).Name = UCase("tbbj") Or oRsTemp.Fields(i).Name = UCase("zc") Then
child.Text = CL(oRsTemp.Fields(i))
Else
If oRsTemp.Fields(i).Name = UCase("csrqsx") Or oRsTemp.Fields(i).Name = UCase("csrqxx") Then
child.Text = CLDate(oRsTemp.Fields(i))
Else
If oRsTemp.Fields(i).Name = UCase("ztrybh") Then
child.Text = "T" + oRsTemp.Fields(i)
Else
child.Text = oRsTemp.Fields(i)
End If
End If
End If
Else
child.Text = ""
End If
Set temp = onode.appendChild(child)
Next
oRsTemp.MoveNext
Loop
oRsTemp.Close
oRs1.MoveNext
Loop
If oRs1.RecordCount > 0 Then
rstoxml = root.xml
oFile.WriteLine (rstoxml)
xmlDoc.removeChild (root)
End If
oRs1.Closetempzdaj = "</la></ma></zdaj:record>"
oFile.WriteLine (tempzdaj)
oRs.MoveNext
Loop
oRs.Closeset oFso=Nothing