我知道在vb.net中读取xml文件比较容易,但由于我们的appl仍然在vb6上,我需要一个解决方法。但不知何故,我被卡住了。我也无法控制xml文件,因为它是从另一个应用程序生成的。 xml文件中的短代码在下面,
<Report>
<Categories>
<Category name="CASHMAN" value="Cash Management" />
<Category name="IM" value="Inventory Management" />
<Category name="POS" value="Point of Sale" />
<Category name="PRODUCT" value="Product" />
</Categories>
</Report>
如果XML文件的格式是这样的,我本可以轻松阅读。
<Report>
<Categories>
<name>CASHMAN</name>
<value>Cash Management</value>
</Categories>
<Categories>
<name>IM</name>
<value>Inventory Management</value>
</Categories>
<Categories>
<name>POS</name>
<value>Point of Sale</value>
</Categories>
<Categories>
<name>PRODUCT</name>
<value>Product</value>
<Categories>
<Report>
但是由于生成的xml文件不在我的控制范围内,所以我现在已经坚持了几个小时。
我需要从这个xml文件中读取NAME-VALUE对。我该怎么做呢?
请帮忙。
答案 0 :(得分:25)
您可以使用MSXML来完成它,它提供与某些.NET XML API类似的功能。我现在没有VB6的副本,但它很容易。首先,从VB6项目中添加对MSXML的引用。然后,您将执行以下操作:
selectNodes("/Report/Categories/Category")
。这将返回IXMLDOMNodeList对象。attributes
属性或使用name
和value
selectSingleNode("@name").Text
和selectSingleNode("@value").Text
MSXML非常灵活,因此您可以使用更短的语法,但上述内容应该适合您。如果您还没有弄清楚,我会在安装VB6的机器上发布代码。
<强> UDPATE:强>
以下是使用您提供的XML示例的工作示例。
Sub ParseXmlDocument()
Dim doc As New MSXML2.DOMDocument
Dim success As Boolean
success = doc.Load(App.Path & "\test.xml")
If success = False Then
MsgBox doc.parseError.reason
Else
Dim nodeList As MSXML2.IXMLDOMNodeList
Set nodeList = doc.selectNodes("/Report/Categories/Category")
If Not nodeList Is Nothing Then
Dim node As MSXML2.IXMLDOMNode
Dim name As String
Dim value As String
For Each node In nodeList
' Could also do node.attributes.getNamedItem("name").text
name = node.selectSingleNode("@name").Text
value = node.selectSingleNode("@value").Text
Next node
End If
End If
End Sub
答案 1 :(得分:2)
根据此问题(以及Ardman链接的文章)中的建议使用MSXML。
您可以使用IXMLDOMElement.getAttributeNode来阅读属性。
例如,下面的代码从MSDN读取sample books.xml file并访问属性。您需要引用a version of Microsoft XML。
Private Sub Form_Load()
Dim xmlDoc As New MSXML2.DOMDocument30
Dim nodeBook As IXMLDOMElement
Dim nodeId As IXMLDOMAttribute
Dim sIdValue As String
xmlDoc.async = False
xmlDoc.Load App.Path & "\books.xml"
If (xmlDoc.parseError.errorCode <> 0) Then
Dim myErr
Set myErr = xmlDoc.parseError
MsgBox ("You have error " & myErr.reason)
Else
Set nodeBook = xmlDoc.selectSingleNode("//book")
Set nodeId = nodeBook.getAttributeNode("id")
sIdValue = nodeId.xml
MsgBox sIdValue
End If
End Sub
答案 2 :(得分:0)
您可以使用XSLT将XML从此结构转换为值对
http://www.xmlfiles.com/articles/sample_chapters/sams_xmlforaspnet/default.asp
答案 3 :(得分:0)
谢谢,这些问题回答了我很多。花了我2天的时间来计算如何
select P.ProductName, count(*) as Ordered
into #totalOrdered
from Products as P
join [Order Details] as OD on P.ProductID = OD.ProductID
group by P.ProductName
select C.CustomerID, P.ProductName, count(*) as Ordered
into #CustomerOrders
from Customers as C
join Orders as O on C.CustomerID = O.CustomerID
join [Order Details] as OD on O.OrderID = OD.OrderID
join Products as P on OD.ProductID = P.ProductID
group by C.CustomerID, P.ProductName
select *
From #CustomerOrders c
join #totalOrdered o on c.ProductName = o.ProductName