显示标签为“xml”的博文。显示所有博文
显示标签为“xml”的博文。显示所有博文

2008年8月27日星期三

Visual Basic load XML

Loading XML Content With Visual Basic

The load method allows you to open an XML source from either a file or a URL. The following example reads an XML file called cd.xml that resides on Juicy Studio. 

The async Property determines whether control is passed back to the application before it's loaded. The defualt value is True, in which case you can use the readyState Property to determine if it's finished loading. By setting it to False, control is passed back to Visual Basic when the document has completed loading.

To try this example, start a new project and add a CommandButton and a TextBox. Set the TextBox Properties, Name to txtXML, MultiLine to True, and ScrollBars to Both. 

Then add the following code to the CommandButton (in this example, called cmdLoad). 

Private Sub cmdLoad_Click() 
Dim xmlDoc As New DOMDocument
Dim xmlRootElement As IXMLDOMElement
Dim xmlError As IXMLDOMParseError
Dim success As Boolean
' Allow the document to complete loading
xmlDoc.async = False 
' Validate the document against a DTD 
xmlDoc.validateOnParse = True
success = xmlDoc.Load("http://www.juicystudio.com/tutorial/xml/cd.xml")
If success = True Then
Set xmlRootElement = xmlDoc.documentElement
txtXML.Text = xmlRootElement.xml
Set xmlRootElement = Nothing
Else
Set xmlError = xmlDoc.parseError
txtXML.Text = "Error code: " & xmlError.errorCode & vbCrLf _
& "Reason: " & xmlError.reason & vbCrLf _
& "Source: " & vbCrLf & xmlError.srcText & vbCrLf _
& "URL: " & xmlError.url
Set xmlError = Nothing
End If
End Sub

2008年8月14日星期四

使用DOM创建XML

我以前在介绍XML和让别人试着使用DOM时,不只一个人问过我用DOM是否能用来凭空直接生成一个XML文件。
  当然,这是当然可以的了,其次是怎么写程序呢。
  那我就这个问题,专门在这篇文章中用VB和MSXML的COM接口的DOM实现的一个例子来讲一下:
  首先我要说明的是,我用的MSXML的版本是IE5带的,版本号是5.0.2919.3800,微软的早期版本的接口和新的有些不一样,所以自己编程时,应该看一下她的接口和说明。
  如果你对vb和COM不太熟悉,看下面的就可能比较费劲了,但VB比起其他的语言实现,应该是比较简单清楚的了。
  首先声明下面要用的几个对象的变量:
Dim tempdoc As MSXML.DOMDocumentDim 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
  下面就是上面程序生成的XML文件内容:
   MyNodeValue
  在MSXML中也有非DOM的接口可以用,这就要看大家自己的用法了。我以前在介绍XML和让别人试着使用DOM时,不只一个人问过我用DOM是否能用来凭空直接生成一个XML文件。
  当然,这是当然可以的了,其次是怎么写程序呢。
  那我就这个问题,专门在这篇文章中用VB和MSXML的COM接口的DOM实现的一个例子来讲一下:
  首先我要说明的是,我用的MSXML的版本是IE5带的,版本号是5.0.2919.3800,微软的早期版本的接口和新的有些不一样,所以自己编程时,应该看一下她的接口和说明。
  如果你对vb和COM不太熟悉,看下面的就可能比较费劲了,但VB比起其他的语言实现,应该是比较简单清楚的了。
  首先声明下面要用的几个对象的变量:
Dim tempdoc As MSXML.DOMDocumentDim 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
  下面就是上面程序生成的XML文件内容:
   MyNodeValue
  在MSXML中也有非DOM的接口可以用,这就要看大家自己的用法了。

2008年8月13日星期三

XML操作中读取一个节点的所有参数并传递到数组

第一次写,不知道传递到数组还是直接用OBJECT更好

Private Function GetNodeValue(ByVal start_at_node As IXMLDOMNode, _
ByVal node_name As String, _
Optional ByVal default_value As String = "") As String
Dim value_node As IXMLDOMNodeList

Set value_node = start_at_node.selectNodes(".//" & node_name)
If value_node Is Nothing Then
GetNodeValue = default_value
Else
For i = 0 To (value_node.length - 1)
GetNodeValue = GetNodeValue + value_node.Item(i).Text + "|"
Next i
End If
End Function

2008年8月12日星期二

xml语言验证器(包含DTD)

http://www.w3school.com.cn/xml/xml_validator.asp

将XML转换成通用XSL作为DOM物件引入recordset

Dim Rs As ADODB.Recordset
Dim xml As MSXML2.DOMDocument
Dim xsl As MSXML2.DOMDocument
Dim newdom As MSXML2.DOMDocument


Private Sub Command1_Click()
Commd.ShowOpen
If Commd.FileName <> "" Then
txtFile.Text = Commd.FileName
Set xml = New MSXML2.DOMDocument
Set xsl = New MSXML2.DOMDocument
Set newdom = New MSXML2.DOMDocument
Set Rs = New ADODB.Recordset
xml.Load txtFile.Text
xsl.Load App.Path + "\temp.xsl"
xml.transformNodeToObject xsl, newdom
Rs.Open newdom
End If
End Sub

将XML作为DOM物件引入recordset

Dim Rs As ADODB.Recordset
Dim xml As MSXML2.DOMDocument60

Private Sub Command1_Click()
Commd.ShowOpen
If Commd.FileName <> "" Then
txtFile.Text = Commd.FileName
Set xml = New MSXML2.DOMDocument60
Set Rs = New ADODB.Recordset
xml.Load txtFile.Text
End If
End Sub

2008年8月10日星期日

利用VB6操作XML数据

什么是XML

   扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。

   XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。

   XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows、Mac OS, Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。

XML的优点

   我们谈到XML长于在不同的应用程序之间交换数据,XML文件也便于构建小的数据库,不久以前,软件都使用INI文件存储配置信息、用户参数以及其他信息,后来微软引入了系统注册表,接作微软告诉我们不应该再使用INI文件了,从那时起Visual Basic对INI文件的支持被削弱了。但不幸的是注册表有几个致命的缺点:不是简单的文本文件,难于读写、可能会变得庞大和缓慢、如果注册表不知何故出现问题,将有可能造成系统死机。

   将配置信息放在XML文件中可以避免这些问题,甚至可以将XML文件设置为一个共享文件,这样在不同的计算机上的用户就可以共享数据,这是注册表所不能比拟的。

   在被称为下一代ASP的ASP.NET中可以在WEB页中直接使用XML,你可以使用数据绑定控件直接绑定数据并自动显示。

   当然也可以不选择XML,使用文本文件、注册表、数据库都可以完成XML所能完成的任务,XML只是你在数据存储和恢复的另一种工具而已。

XML语法简介

   XML的语法非常的简单,XML文档由节点组成,使用打开和关闭节点描述标记,在格式上与HTML标记非常相似,它们之间最大的不同是:XML中可以自由定义标记名。比如下面的标记就描述了一个电话号码:

<Phone>987-654-3210</Phone>

   而且不用声明标记名就可以使用。

   开始和结束标记必须相同,XML是识别大小写的,所以标记的大小写也必须相同。比如上面的例子中以<Phone>标记开始就必须以</Phone>标记结束,而不能是</phone>或</PHONE>

   节点标记中可以包含属性,比如下面的代码中Phone节点包含属性Type,其值为WorkFax:

<Phone Type="WorkFax">987-654-3210<Phone>

   如果不愿意在节点中包含一个值,那么可以不需要结束标记,可以用在开始标记的后面加一个斜线来结束节点,在下面的例子中,Phone标记的Number属性就存储了一个电话号码,所以就不需要一个结束标记:

<Phone Type="WorkFax" Number="987-654-3210" />

   XML文档的结构是一个树形等级结构。文档必须有一个唯一的根结点,根节点包含所有其它节点。下面我们举一个较为完整的例子:

<Addresses>
  <Entry Type="Personal">
   <FirstName>Andy</FirstName>
   <LastName>Fickle</LastName>
   <Street>1234 Programmer Place</Street>
   <City>Bugsville</City>
   <State>CO</State>
   <Zip>82379</Zip>
   <Phone Type="Home">354-493-9489</Phone>
  </Entry>
  <Entry Type="Work">
   <FirstName>Betty</FirstName>
   <LastName>Masterson</LastName>
   <Phone Type="Work">937-878-4958</Phone>
   <Phone Type="WorkFax">937-878-4900</Phone>
  </Entry>
  ...
</Addresses>

   注意相似的节点不需要包含相同的信息,例如第一个Entry节点包含了地址信息和家庭电话号码,第二个Entry节点包含了Work和WorkFax电话号码,而没有包含第一个Entry节点包含的信息。
XML工具

   如前面的例子显示,XML语法是如此的简单以至于你可以在很短的时间作一个XML解析器,幸运的是你不必这样做,因为XML工具可以运行在各种平台上,包括可以安装了Visual Basic的Windows。

   正是这些L工具而不是XML本身使XML变得更强大和复杂。不同的解析器使你可以某一时刻加载整个XML文档或只加载某个节点,与此相反,XML Writer 可以同时创建一个XML文档和节点。

   DOM解析器使我们能够很方便的加载、复制、排序、修改和存储XML文件,遍历节点获得名称或属性,并给结果排序。虽然他们的功能没有真正的关系数据库强大,但DOM的这些特点依然非常有用。

   XSD可以定义XML文档的格式,XSL扩展样式单定义了怎样将XML文档转换成其他可以在WEB浏览器中浏览的文件格式,比如HTML文件。

   这些工具实际上比XML本身更复杂,所以所有讲解XML的书籍都花了很大的篇幅解释这些XML工具。但这超出了本文的范围,有兴趣的读者可以参考有关资料。

   Visual Basic.Net提供了使用XML、XSL以及其他XML工具的完整工具。但不用等待VB.NET,微软XML核心服务(MSXML)版本4.0提供了从Visual Basic6.0加载和存储XML文档的工具。

   在msdn.microsoft.com/xml/default.asp中下载最新版本的MSXML,并安装在计算机上。在Visual Basic 6.0中使用Microsoft XML V4.0象引用其他对象一样,首先在工程菜单中选择引用菜单项,选择Microsoft V4.0,单击OK,一切完成后就现在就可以在VB应用程序中添加XML对象了。

DOMDocument 类

   文档对象模型(DOM)使用了一系列相应的对象描述了XML文档的等级状态,DOMDocument类是一个描绘XML文档的DOM结构的MSXML类。

   DOMDocument类仅仅提供了很少的几个有用的属性和方法。Load方法载入一个xml文件,loadxml方法将字符串作为xml数据添加到对象中。例如,下面的代码就将一个小的xml文件添加到名为xml_document的文档中。

Dim xml_document As New DOMDocument

xml_document.loadXML _
"<Person>" & vbCrLf & _
" <FirstName>Rod</FirstName>" & vbCrLf & _
" <LastName>Stephens</LastName>" & vbCrLf & _
"</Person>"

   DOMDocument的xml属性返回文档的xml描述,可以显示这些返回值看看这些文档究竟是什么样子,也可以将它存储为一个文件,但这完全不必要,因为DOMDocument对象的save方法已经自动将他们存储了。

   DOMDocument对象的documentElement属性表示文档数据的根结点,通常情况下操作XML文档都从这里开始。

   DOMDocument提供了几种创建新节点的方法。CreateElement方法为文档创建一个新的元素节点,其他创建节点的方法有createAttribute, createProcessingInstruction, 和 createTextNode,在这里就不一一介绍了。

IXMLDOMNode类

   IXMLDOMNode类描述了一个节点,该类提供了一系列用于搜索和操纵XML文档的属性和方法。
selectSingleNode 方法用于搜索指定节点的后代,用于搜索指定节点路径的语言称为XPATH,XPATH非常棘手,本文就不详细说明其规范了。下面我们将介绍两个对搜索子节点有特别有用并且简单的方法。

   在给selectsingleNode方法中输入子节点的名字,该方法将在节点的子节点进行精确匹配搜索。如果在输入的字符串前面加上".//",那么将搜索节点的全部后代。

' Search for a child node named "LastName."
Set last_name_node = address_node.selectSingleNode("LastName")

' Search for any descendant named "LastName."
Set last_name_node = address_node.selectSingleNode(".//LastName")

   下面列出了IXMLDOMNode对象的部分非常有用的属性:

    attributes.节点属性集合

    nodeName.节点的标记名

    nodeTypeString.节点的类型

    ownerDocument.返回DOMDocument对象包含的节点

    text.表示节点包含的文本内容。如果该节点包含其他节点,那么text代表了所有节点的文本内容的组合。

    xml.给出了节点的xml内容,例如:"<FirstName>Rod</FirstName>".

   ChildNodes集合包含了节点的子节点。要给节点增加一个子节点,首先必须给使用DOMDocument对象的节点创建方法,然后将这个新建的节点加入到父节点的childNodes集合中。下面的代码展示了创建一个新的子节点的子程序,并使用父节点的appendChild方法将其加入到父节点中:

' Add a new node to the indicated parent node.
Private Sub CreateNode(ByVal indent As Integer, _
ByVal parent As IXMLDOMNode, ByVal node_name As String, _
ByVal node_value As String)
Dim new_node As IXMLDOMNode

' Create the new node.
Set new_node = parent.ownerDocument.createElement(node_name)

' Set the node's text value.
new_node.Text = node_value

' Add the node to the parent.
parent.appendChild new_node
End Sub