2013-04-22 82 views
1

我们的一个系统以下列格式向我们提供XML。使用excel vba读取自定义xml输出

你能帮我解析这个XML并使用Excel 2010 vba存储到数组中吗?

我想阅读标签中的内容。

在此先感谢您的帮助。

<report_output> 
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-' 
    xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-' 
    xmlns:rs='urn:schemas-microsoft-com:rowset' 
    xmlns:z='#RowsetSchema' 
    content="Report" 
    title="CURVE REPORT" 
    resultHeading="DUMPCURVE" 
    resultName="CURVE REPORT" 
    runat="04/22/13" 
    user="xxx" 
    database="xxx" 
    version="xxx" 
    applicationdate="04/22/13" 
    > 
    <s:Schema id='RowsetSchema'> 
    <s:ElementType name='row' content='eltOnly'> 
<s:attribute type='GeneratedPK' />  <s:attribute type='Ccy'/> 
     <s:attribute type='dmIndex'/> 
     <s:attribute type='CurveID'/> 
     <s:attribute type='CurveDate'/> 
     <s:attribute type='Days'/> 
     <s:attribute type='Rate'/> 
     <s:extends type='rs:rowbase'/> 
    </s:ElementType> 
<s:AttributeType name='GeneratedPK' rs:number='1' rs:maybenull='false' 
rs:keycolumn='true' rs:autoincrement='true' rs:writeunknown='true'> 
<s:datatype dt:type='int' /> 
</s:AttributeType> 
    <s:AttributeType name='Ccy' rs:number='2' rs:maybenull='true' rs:writeunknown='true'> 
     <s:datatype dt:type='string' dt:maxLength='4' origDataType='STRING'/> 
    </s:AttributeType> 
    <s:AttributeType name='dmIndex' rs:number='3' rs:maybenull='true' rs:writeunknown='true'> 
     <s:datatype dt:type='string' dt:maxLength='6' origDataType='STRING'/> 
    </s:AttributeType> 
    <s:AttributeType name='CurveID' rs:number='4' rs:maybenull='true' rs:writeunknown='true'> 
     <s:datatype dt:type='string' dt:maxLength='9' origDataType='STRING'/> 
    </s:AttributeType> 
    <s:AttributeType name='CurveDate' rs:number='5' rs:maybenull='true' rs:writeunknown='true'> 
     <s:datatype dt:type='string' dt:maxLength='10' origDataType='DATE '/> 
    </s:AttributeType> 
    <s:AttributeType name='Days' rs:number='6' rs:maybenull='true' rs:writeunknown='true'> 
     <s:datatype dt:type='string' dt:maxLength='35' origDataType='STRING'/> 
    </s:AttributeType> 
    <s:AttributeType name='Rate' rs:number='7' rs:maybenull='true' rs:writeunknown='true'> 
     <s:datatype dt:type='number' dt:maxLength='50' origDataType='RATES '/> 
    </s:AttributeType> 
    </s:Schema> 
    <rs:data> 
    <z:row 
GeneratedPK='1' 
    Ccy='xxx' 
    dmIndex='xxx' 
    CurveID='xxxx' 
    CurveDate='2013-04-23T00:00:00' 
    Days='1' 
    Rate='0000' 
    /> 
    <z:row 
GeneratedPK='2' 
    Ccy='xxx' 
    dmIndex='xxxxx' 
    CurveID='xxxxx' 
    CurveDate='2013-05-24T00:00:00' 
    Days='32' 
    Rate='00000000' 
    /> 
    <z:row 
GeneratedPK='3' 
    Ccy='xxx' 
    dmIndex='xxx' 
    CurveID='xxxx' 
    CurveDate='2013-04-23T00:00:00' 
    Days='1' 
    Rate='0000' 
    /> 
    <z:row 
GeneratedPK='4' 
    Ccy='xxx' 
    dmIndex='xxxxx' 
    CurveID='xxxxx' 
    CurveDate='2013-05-24T00:00:00' 
    Days='32' 
    Rate='00000000' 
    /> 
<z:row 
GeneratedPK='5' 
    Ccy='xxx' 
    dmIndex='xxx' 
    CurveID='xxxx' 
    CurveDate='2013-04-23T00:00:00' 
    Days='1' 
    Rate='0000' 
    /> 
    <z:row 
GeneratedPK='6' 
    Ccy='xxx' 
    dmIndex='xxxxx' 
    CurveID='xxxxx' 
    CurveDate='2013-05-24T00:00:00' 
    Days='32' 
    Rate='00000000' 
    /> 
</rs:data> 
</xml> 




</report_output> 

所以在Excel VBA中到目前为止,我已经尝试下面的代码,但不能进行进一步

Dim xmldoc As New MSXML2.DOMDocument 
xmldoc.Load ("C:\DOCUME~1\xyz\LOCALS~1\Temp\zr_aud_bbsw_130422.xml") 
+0

向我们展示你所编写的代码,我们将帮助您改善它,或修复你尝试读取XML文件ADO – 2013-04-22 08:47:27

+0

问题通过ADODB方法输出。您是否考虑过直接使用VBA打开记录集并使用** Copyfromrecordset **将数据转储到Excel中? – 2013-04-22 08:58:57

+0

你的XML看起来已经 – 2013-04-22 09:03:46

回答

2

感谢菲利普的帮助下,我可以解析我的XML。以下是我最后的代码读取其中存储下属性为我的XML和提取数据

Option Explicit 
Public Sub LoadDocument() 
Dim xDoc As MSXML.DOMDocument 
Set xDoc = New MSXML.DOMDocument 
xDoc.validateOnParse = False 
If xDoc.Load("C:\LOG\zr_aud_bbsw_130422.xml") Then 
    ' The document loaded successfully. 
    ' Now do something intersting. 
    DisplayNode xDoc.ChildNodes, 0 
Else 
    ' The document failed to load. 
    ' See the previous listing for error information. 
End If 
End Sub 

Public Sub DisplayNode(ByRef Nodes As MSXML.IXMLDOMNodeList, _ 
    ByVal Indent As Integer) 

    Dim xNode As MSXML.IXMLDOMNode 
    Dim xAttribute As MSXML.IXMLDOMAttribute 
    Indent = Indent + 2 

    For Each xNode In Nodes 
     If xNode.NodeType = NODE_ELEMENT And Trim(xNode.ParentNode.nodeName) = "rs:data" Then 
     For Each xAttribute In xNode.Attributes 
      Debug.Print Space$(Indent) & xAttribute.BaseName & _ 
      ":" & xAttribute.NodeValue 
     Next xAttribute 

     End If 

     If xNode.HasChildNodes Then 
     DisplayNode xNode.ChildNodes, Indent 
     End If 
    Next xNode 
End Sub 
+0

+1做得好 - 它**总是**更好地学习如何钓鱼比被给予鱼:) – 2013-04-23 08:21:41

0

不要忘了选择使用XPath语法来选择节点

这将返回所有的行节点的节点列表

Dim nodelist As MSXML2.IXMLDOMNodeList 
    Set nodelist = xDoc.SelectNodes("//rs:data/z:row") 

使用XPath你可以把条件对这样

Dim nodelist As MSXML2.IXMLDOMNodeList 
    Set nodelist = xDoc.SelectNodes("//rs:data/z:row[@CurveDate='2013-04-23T00:00:00']") 
一个或多个属性

可以将[]括号放置在xpath表达式中的其他节点和多个节点上,并且可以使用通配符以及对父节点或子节点的前后引用。

了解更多有关XPath这里http://www.w3schools.com/xpath/xpath_syntax.asp