2013-11-21 66 views
0

我想用VBA解析xml以获得来自电气测试系统的测试结果。这是一个什么样的系统是给我一个例子:从<Prop Type='Obj' TypeName='NI_CriticalFailureStackEntry' Flags='0x0'> <Value>Brady Detection</Value>用VBA解析XML

<Reports> 
<Report Type='UUT' Title='UUT Report' Link='-1-2013-11-20-10-2-46-867' UUTResult='Failed' StepCount='132'> 
<Prop Name='UUT' Type='Obj' TypeName='UUT' Flags='0x0'> 
    <Prop Name='SerialNumber' Type='String' Flags='0x0'> 
     <Value>02</Value> 
    </Prop> 
    <Prop Name='PartNumber' Type='String' Flags='0x0'> 
     <Value>1009433</Value> 
    </Prop> 
    <Prop Name='LotNumber' Type='String' Flags='0x0'> 
     <Value>1234567</Value> 
    </Prop> 
    <Prop Name='CriticalFailureStack' Type='Array' LBound='[0]' HBound='[1]' ElementType='Obj' Flags='0x0'> 
     <ArrayElementPrototype Type='Obj' TypeName='NI_CriticalFailureStackEntry' Flags='0x0'> 
      <Prop Name='StepName' Type='String' Flags='0x0'> 
       <Value></Value> 
      </Prop> 
      <Prop Name='SequenceName' Type='String' Flags='0x0'> 
       <Value></Value> 
      </Prop> 
      <Prop Name='SequenceFileName' Type='String' Flags='0x0'> 
       <Value></Value> 
      </Prop> 
      <Prop Name='ResultId' Type='Number' Flags='0x0'> 
       <Value>0</Value> 
      </Prop> 
     </ArrayElementPrototype> 
     <Value ID='[0]'> 
      <Prop Type='Obj' TypeName='NI_CriticalFailureStackEntry' Flags='0x0'> 
       <Prop Name='StepName' Type='String' Flags='0x0'> 
        <Value>Brady Detection</Value> 
       </Prop> 
       <Prop Name='SequenceName' Type='String' Flags='0x0'> 
        <Value>MainSequence</Value> 
       </Prop> 
       <Prop Name='SequenceFileName' Type='String' Flags='0x0'> 
        <Value>1009450 AT ILR Final-test_app.seq</Value> 
       </Prop> 
       <Prop Name='ResultId' Type='Number' Flags='0x0'> 
        <Value>44</Value> 
       </Prop> 
      </Prop> 
     </Value> 
     <Value ID='[1]'> 
      <Prop Type='Obj' TypeName='NI_CriticalFailureStackEntry' Flags='0x0'> 
       <Prop Name='StepName' Type='String' Flags='0x0'> 
        <Value>Number of Brady Beats</Value> 
       </Prop> 
       <Prop Name='SequenceName' Type='String' Flags='0x0'> 
        <Value>Brady Detection</Value> 
       </Prop> 
       <Prop Name='SequenceFileName' Type='String' Flags='0x0'> 
        <Value>1009450 AT ILR Final-test_app.seq</Value> 
       </Prop> 
       <Prop Name='ResultId' Type='Number' Flags='0x0'> 
        <Value>49</Value> 
       </Prop> 

我想从<prop name = 'serial number'><Report UUTResult = 'Failed'>拉出序列号,测试结果和设备故障从来没有使用XML工作过,但是这是我通过阅读这个网站迄今为止得到:

Dim xml As New MSXML.DOMDocument60 
Dim xReport As IXMLDOMElement 
Dim result As String 

xml.Load (filePath) 
Set xReport = xml.SelectSingleNode("//Reports/Report/") 
result = xReport.getAttribute("UUTResult") 

当我跑,我得到“运行时错误“2147467259(80004005):自动化设置xReport时出现错误未指定错误。

我也尝试将xml作为新的MSXML2.DOMDocument(而不是DOMDocument60)进行投射,然后在同一行中得到类型不匹配。

任何帮助非常感谢!

谢谢。

+0

我似乎记得收到错误一样,当没有很好地形成的XML文档。它在开始时是否有'xml'元素? – Mansfield

+0

This [link](http://stackoverflow.com/questions/19729601/dynamically-search-for-data-in-an-xml-file-with-vba/19730346#19730346)可能会有所帮助。 – Santosh

+0

我在第2行的原始文章中启动了代码。这是第一行:<?xml version =“1.0”encoding =“iso-8859-1”?><?xml-stylesheet type =“text/xsl” HREF =? “C:\数据\ horizo​​ntal.xsl”> – mkodikan

回答

2

这里是一个办法让你的数据,而无需使用MSXML

久经考验

如果将XML的格式不会比这个改变会给你想要的东西。

Option Explicit 

Sub Sample() 
    Dim MyData As String, strData() As String 
    Dim i As Long 
    Dim sString As String 

    '~~> Replace your file here 
    Open "C:\Sample.xml" For Binary As #1 
    MyData = Space$(LOF(1)) 
    Get #1, , MyData 
    Close #1 
    strData() = Split(MyData, vbCrLf) 

    For i = LBound(strData) To UBound(strData) 
     If InStr(1, strData(i), "<Prop Name='SerialNumber'", vbTextCompare) Then 
      sString = strData(i + 1) 
      Exit For 
     End If 
    Next 

    If sString <> "" Then 
     Debug.Print Trim(Replace(Replace(sString, "<Value>", ""), "</Value>", "")) 
    End If 
End Sub 

输出

enter image description here