以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 WORD to XML, HTML to XML 』  (http://bbs.xml.org.cn/list.asp?boardid=13)
----  如何实现文本文件与XML文本格式的转换  (http://bbs.xml.org.cn/dispbbs.asp?boardid=13&rootid=&id=24900)


--  作者:anyoneokay
--  发布时间:12/2/2005 7:44:00 AM

--  如何实现文本文件与XML文本格式的转换
我想在VB上实现文本文件与XML文本格式的转换,不知如何实现
(希望不要用工具,因为在编程里不好用第三方工具)
比如说:有一文本文件1.txt,内容如下
        id     name    sal
        001    aaa     111
        002    bbb     222
        003    ccc     333
        ...    ...     ...
怎样把它转换为xml文件形式存储。
还有如果有这种xml文件又如何把它转换为文本格式
--  作者:漂泊水手
--  发布时间:1/3/2006 8:20:00 PM

--  
用Msxml.dll 解析器吧,我也刚学一起研究一下

对于XML文档,插入、修改、检索等数据操作工作可以通过一个XML解析器及其列举的一系列对象来完成。 Microsoft的XML解析器驻留在名为msxml.dll的动态链接库文件中。因为msxml是一个COM对象,所以可以在任何兼容ActiveX的环境中使用它,如在VB和 ASP中。本文介绍在Visual Basic中操纵XML文档的具体方法。  

装载XML文档  
新建一个VB Standard EXE工程项目。在Form1中添加一个CommandButton控件,将其Name和Caption属性分别设为cmdLoad和Load XML。为了使用msxml解析器,必须事先设置工程项目对msxml.dll的引用。选择Project菜单的 References命令,选中Microsoft XML, version 2.0或更高版本。将下列代码加入 cmdLoad_Click事件:  
Option Explicit
Dim xml As DOMDocument
Private Sub cmdLoad_Click()
Set xml = New DOMDocument
Call xml.Load(App.Path & “flight.xml")
' flight.xml为描述航班信息的XML文档
End Sub

运行该程序,点击Load XML按钮即可装载XML文档。载入的XML文档包含一个按照树状结构排列的节点对象集合,顶层节点或根节点是 documentElement。每个节点都有一组属性和方法,每个节点可以包含一个或多个子节点,当然也可以不包含任何节点。必须先取得对根节点的引用才能操纵XML文档。在 cmdLoad_Click事件代码后添加下列代码:  

Dim root As IXMLDOMElement
Set root = xml.documentElement

遍历节点集合  
可以使用Visual Basic的For Each...Next循环结构在节点对象集合中循环。在cmdLoad_Click事件代码后添加下列代码:  
Dim node As IXMLDOMNode
For Each node In root.childNodes
Debug.Print node.Text
Next

运行后点击Load XML按钮,将会在Immediate窗口中看到如下输出结果:  

2000年10月15日  
北京 首都国际 香港 赤邋角 中国国际航空公司 波音公司  
B747 13:00 15:55  
上海 浦东 法兰克福 美茵 塔什干 尤日内 汉莎航空公司 空中客车工业公司  
A330 21:45 01:45  

注意,每个节点的Text属性不仅包含自身的属性值,还包含其下属所有子节点的Text属性值。一般情况下,不会同时操作所有的节点。可以使用 selectNodes方法取得对一个特定的节点子集的引用,selectNodes方法返回一个 IXMLDOMNodeList对象。在cmdLoad_Click事件代码后添加下列代码:  

Dim flightNodes As IXMLDOMNodeList
Set flightNodes = root.selectNodes(“航班")
For Each node In flightNodes
Debug.Print node.selectSingleNode
(“离站时间").Text & “――"  
&node.selectSingleNode (“到站时间").Text
Next

这段代码使用selectNodes方法选择根节点下所有的“航班”节点,然后使用selectSingleNode方法选择“航班”节点下的“离站时间”和“到站时间”,读取并打印它们的Text属性值。  

可以使用childNodes集合以递归的方式层次化显示XML 文档的内容。  

首先,在Form1中声明一个子过程PrettyPrint。  

Public Sub PrettyPrint(node As IXMLDOMNode,
Optional tabLevel As Integer=0)
Dim childNode As IXMLDOMNode
If node.nodeName<>vbNullStrin  
And node.nodeName < >“#text" Then
Debug.PrintString(tabLevel,Chr$(9))
&“< "&node.nodeName&“ >"
End If
If node.hasChildNodes Then
For Each childNode In node.childNodes
Call PrettyPrint(childNode,tabLevel+1)
Next
Else
Debug.PrintString(tabLevel+1,Chr$(9))&node.Text
End If
If node.nodeName< >vbNullString And node.nodeName
< >“#text" Then
Debug.PrintString
(tabLevel,Chr$(9))&“< /"&node.nodeName&“ >"
End If
End Sub

然后在Form1中加入第2个CommandButton控件,将其 Name和Caption属性分别设为cmdPrint和Print。将下列代码加入事件cmdPrint_Click中:  

Private Sub cmdPrint_Click()
If Not xml Is Nothing Then
Call PrettyPrint
(xml.documentElement)
End If
End Sub

运行程序。首先点击Load XML按钮加载flight.xml,然后点击Print按钮。在Immediate窗口中可以看到层次分明、易于阅读的输出结果。子过程 PrettyPrint在documentElement的子节点中循环,打印每个节点的nodeName属性值,而每个子节点又递归调用PrettyPrint。XML文档内各节点内在的相似性是XML最具吸引力的特性,每个子节点都与其父节点有着相同的属性和方法(尽管各自的内容通常不同),这就使得为同一文档中的所有或部分节点编写某种规则变得相对简单。  

修改节点内容  
如同修改数据库中的记录一样,也可以修改XML文档中节点的内容。下列代码修改了flight.xml文档中“发布日期”节点的Text属性值:  
Set node = root.selectSingleNode(“发布日期")
If Not node Is Nothing Then
node.Text = “2000年10月20日"
End If

修改了文档内容之后,可以使用Save方法保存修改后的文档。Save方法可以将XML文档保存为文件、数据流或ASP的Response对象。Save方法的用法如下:  

xml.save App.Path & “flightupdated.xml"

将上面两段代码添加在cmdLoad_Click事件中,运行程序。点击Load XML按钮,在程序工作目录中会增加一个新文件flightupdated.xml。在IE5 中打开该文件,可以看到“发布日期”标记的文本已经被改为“2000年10月20日”。  
----------------------------------------------------------
在实际应用中,XML可以被用作数据传输格式、可搜索数据库、可定制的数据存储方式和显示信息的数据源(需要XSL或如VB这样的编程语言的帮助)。因为msxml是一个COM对象,所以可以在ASP页中使用它的实例,然后方便地使用VBScript或JScript编程来操纵它。
我以前在介绍XML和让别人试着使用DOM时,不只一个人问过我用DOM是否能用来凭空直接生成一个XML文件。

  当然,这是当然可以的了,其次是怎么写程序呢。

  那我就这个问题,专门在这篇文章中用VB和MSXML的COM接口的DOM实现的一个例子来讲一下:

  首先我要说明的是,我用的MSXML的版本是IE5带的,版本号是5.0.2919.3800,微软的早期版本的接口和新的有些不一样,所以自己编程时,应该看一下她的接口和说明。

  如果你对vb和COM不太熟悉,看下面的就可能比较费劲了,但VB比起其他的语言实现,应该是比较简单清楚的了。

  首先声明下面要用的几个对象的变量:

Dim tempdoc As MSXML.DOMDocument
Dim tempnode As MSXML.IXMLDOMNode
Dim tempelement As MSXML.IXMLDOMElement
Dim tempattribute As MSXML.IXMLDOMElement
Dim root As MSXML.IXMLDOMElement

  生成一个XML DOMDocument对象

Set tempdoc = New MSXML.DOMDocument

  生成根节点并把它设置为文件的根

Set root = tempdoc.createElement("MyRoot")
Set tempdoc.documentElement = root

  生成孩子节点添加到根节点上去,并且为这个节点设置一个属性

Set tempnode = tempdoc.createNode(MSXML.NODE_ELEMENT, "MyNode", "")
tempnode.Text = "MyNodeValue"
root.appendChild tempnode

  取得元素节点的接口,添加属性

Set tempelement = tempnode
tempelement.setAttribute "MyAttribute", "MyAttributeValue"

  写xml文件

Open "MyXMLFile.xml" for output as #1
Print #1, root.XML
Close #1


--  作者:wind820
--  发布时间:3/11/2006 11:39:00 PM

--  
按照上面的代码遍历节点集合不成功.提示"实"时错误91,对象变量或WITH块变量未设置",请问是什么原因呢?
--  作者:bibiye
--  发布时间:3/12/2006 12:43:00 AM

--  
谢谢!
--  作者:lijie1586
--  发布时间:12/2/2006 4:24:00 PM

--  
和3楼的一样
会有一个错误91
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms