将XML内容导入Excel

拉吉

我是VBScript和XML编码的新手。但是,请尽我所能并尝试理解W3 Schools和其他在线论坛中的概念。

我想使用VBScript读取/解析xml文件,我的XML文件不是数据,而是来自应用程序的xml源代码。

以下是我正在使用的代码段-

Sub LoadXMLFile()

Dim objXML     'for xml document
Dim objNode    'for xml node item
Dim i As Integer
i = 0

Set objXML = CreateObject("Microsoft.XMLDOM")
objXML.Load ("C:\path\test.xml")
objXML.setProperty "SelectionLanguage", "XPath"
Set objNode = objXML.SelectNodes("/report/queries/query/selection/dataItem/text()")
'MsgBox objNode.Text

For i = 0 To (objNode.Length - 1)
NodeVal = objNode(i).NodeValue
MsgBox NodeVal
Next

End Sub

当我逐步执行VB代码时,objNode.Length值始终计算为0。不知道为什么它不计算Length。

这是我要解析的xml-

<report xmlns="http://developer.cognos.com/schemas/report/10.0/" useStyleVersion="10" expressionLocale="en-us">
<modelPath>
/content/package[@name='GO Sales (query)']/model[@name='model']
</modelPath>
<drillBehavior/>
<queries>
<query name="Query1">
<source>
<model/>
</source>
<selection>
<dataItem aggregate="none" rollupAggregate="none" name="Product line">
<expression>[Sales (query)].[Products].[Product line]</expression>
<XMLAttributes>
<XMLAttribute output="no" name="RS_dataType" value="3"/>
<XMLAttribute output="no" name="RS_dataUsage" value="attribute"/>
</XMLAttributes>
</dataItem>
<dataItem aggregate="none" rollupAggregate="none" name="Product type">
<expression>[Sales (query)].[Products].[Product type]</expression>
<XMLAttributes>
<XMLAttribute output="no" name="RS_dataType" value="3"/>
<XMLAttribute output="no" name="RS_dataUsage" value="attribute"/>
</XMLAttributes>
</dataItem>
</selection>
</query>
</queries>
</report>

感谢您的时间和回应。

谢谢与问候拉吉

阿克塞尔·里希特(Axel Richter)

第一个问题是dataItem元素没有文本节点作为直接子节点。因此...dataItem/text()将返回null。

dataItem元素包含元素节点expressionXMLAttributesexpression包含一个文本节点。XMLAttributes包含进一步的子节点。

如果找到了dataItem元素,我们可以遍历所有这些节点或者我们可以简单地从所有子节点获取所有文本内容。XML DOM对象/接口中介绍了我们可以使用XML DOM对象做什么

第二个问题是您的XML中定义了一个名称空间。这需要XML解析器知道。如果不是,则解析器将假定名称空间之外的所有元素,因此它将无法找到名称空间中的所有元素。

因此,使用您的XML,您可以执行以下操作:

Sub LoadXMLFile()

Dim objXML         'for xml document
Dim objNodeList    'for xml node lists
Dim objNode        'for xml node
Dim oAttribute     'for xml attribute
Dim oChildNode     'for xml node
Dim oSubChildNode  'for xml node

Set objXML = CreateObject("Microsoft.XMLDOM")
objXML.Load ("C:\Users\Axel Richter\Desktop\test.xml")
objXML.setProperty "SelectionLanguage", "XPath"
objXML.setProperty "SelectionNamespaces", "xmlns:dcc=""http://developer.cognos.com/schemas/report/10.0/"""

Set objNodeList = objXML.SelectNodes("/dcc:report/dcc:queries/dcc:query/dcc:selection/dcc:dataItem")

For Each objNode In objNodeList
 MsgBox objNode.Text 'the text content in this element and its child elements

 'go through all attributes
 For Each oAttribute In objNode.Attributes
  MsgBox oAttribute.Name & ": " & oAttribute.Text
 Next

 'go through all child nodes
 For Each oChildNode In objNode.ChildNodes
  'if the child node has child b´nodes of its own, go through them too
  If oChildNode.HasChildNodes Then
   For Each oSubChildNode In oChildNode.ChildNodes
    MsgBox oSubChildNode.nodeName & ": " & oSubChildNode.XML
   Next
  Else
   MsgBox oChildNode.nodeName & ": " & oChildNode.Text
  End If
 Next

Next

End Sub

objXML.setProperty "SelectionNamespaces", "xmlns:dcc=""http://developer.cognos.com/schemas/report/10.0/"""

dcc为命名空间定义一个前缀

http://developer.cognos.com/schemas/report/10.0/

dcc是我自己的选择(d eveloper ç ognos Ç OM)。要使selectNodes方法中的XPATH正常工作,需要此前缀由于根元素report具有此xmlns属性,因此XML中的所有元素都在此命名空间中,因此XPATH需要report从该命名空间中选择其所有子元素否则它将无法正常工作。因此dcc,此名称空间中XPATH-selects中的所有元素都需要前缀。如果存在多个名称空间,则需要多个前缀。每个名称空间一个。

这是XPATH的准确工作条件之一。getElement...方法将对此名称空间具有更大的容忍度。但实际上,名称空间在那里,因此也应予以尊重。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章