用VBA解析XML

用VBA解析XML,xml,vba,excel,xml-parsing,Xml,Vba,Excel,Xml Parsing,我正在尝试用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 Nam

我正在尝试用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>
当我运行这个程序时,我得到了“运行时错误”-2147467259(80004005)”:setxreport处的自动化错误未指定错误

我还尝试将xml转换为新的MSXML2.DOMDocument(而不是DOMDocument60),但在同一行中出现了类型不匹配

非常感谢您的帮助


谢谢。

这里有一种不用
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
选项显式
子样本()
将MyData设置为字符串,将strData()设置为字符串
我想我会坚持多久
将字符串变暗为字符串
“~~>在此处替换您的文件
打开二进制文件的“C:\Sample.xml”作为#1
MyData=空间$(LOF(1))
获取#1,MyData
关闭#1
strData()=拆分(MyData,vbCrLf)
对于i=LBound(strData)到UBound(strData)

如果InStr(1,strData(i),“我似乎记得当xml文档格式不正确时会出现这样的错误。它在一开始就有
xml
元素吗?这可能会有帮助。我在我的原始帖子的第2行开始了代码。这是第一行:
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