2013-04-22 85 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