首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VBA中读取XML (MSInfo32)以进行访问

在VBA中读取XML (MSInfo32)以进行访问
EN

Stack Overflow用户
提问于 2017-09-20 05:19:45
回答 1查看 317关注 0票数 1

我正在尝试从MSInfo32 XML文件导入数据。我只想导入"System Summary“、"Component"/"Storage”下的"Drives“和"Software Environment”下的"Program Group“。

以下是xml文件的片段:

代码语言:javascript
复制
<?xml version="1.0"?>
<MsInfo>
<Metadata>
<Version>8.0</Version>
<CreationUTC>09/18/17 03:42:48</CreationUTC>
</Metadata>
<Category name="System Summary">
<Data>
<Item><![CDATA[OS Name]]></Item>
<Value><![CDATA[Microsoft Windows 10 Pro]]></Value>
</Data>
    <Category name="Components">
        <Category name="Storage">
            <Category name="Drives">
                <Data>
                <Item><![CDATA[Drive]]></Item>
                <Value><![CDATA[C:]]></Value>
                </Data>
            </Category>
        </Category>
    </Category>
    <Category name="Software Environment">
        <Category name="Environment Variables">
        </Category>
        <Category name="Program Groups">
            <Data>
            <Group_Name><![CDATA[Start Menu\Programs\Accessibility]]></Group_Name>
            <Name><![CDATA[Default:Start Menu\Programs\Accessibility]]></Name>
            <User_Name><![CDATA[Default]]></User_Name>
            </Data>
        </Category>
    </Category>
</Category>
</MsInfo>

下面是我糟糕的代码:

代码语言:javascript
复制
Private Sub xxReadXML()
    Dim xDoc As Object, root As Object
    Set xDoc = CreateObject("MSXML2.DOMDocument")
    xDoc.async = False
    xDoc.validateOnParse = False

    If xDoc.Load(SystemInfoFileTxt.Value) Then
        ' The document loaded successfully.
        ' Now do something intersting.
        Set MSInfoNode = xDoc.DocumentElement.childNodes(0)
        Set CategoryNode = xDoc.DocumentElement.childNodes(1)
        Set DataNode = xDoc.DocumentElement.childNodes(2)

        For Each DataNode In xDoc.selectNodes("/MsInfo/Category/Data")
            Set ItemNode = DataNode.SelectSingleNode("Item")
            Set ValueNode = DataNode.SelectSingleNode("Value")
            If Not ItemNode Is Nothing Then
                ListBox1.AddItem (ItemNode.Text)
            End If
            If Not ValueNode Is Nothing Then
                ListBox1.AddItem (ValueNode.Text)
            End If
            ListBox1.AddItem ("")
         Next DataNode
    Else
    End If
Set xDoc = Nothing
End Sub

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2017-09-21 03:23:01

我已经编写了一个小的XML解析器,它只运行4层深度的节点,如果有name属性,就打印它的内容,如果它没有子节点,就打印它的内容(编写一个递归的解析器可能会花费更少的精力,但这更容易定制)。

这近似于您想要的行为。您将需要进行一些自定义,但因为我不能准确地在您的输出中获得系统,所以我不能为您执行此操作。

我还切换到了MSXML2 v6.0和早期绑定

代码语言:javascript
复制
Private Sub xxReadXML()
    Dim xDoc As New MSXML2.DOMDocument60
    Dim root As XMLNode
    xDoc.async = False
    xDoc.validateOnParse = False
    Dim CategoryNode As IXMLDOMNode
    Dim DataNode As IXMLDOMNode
    Dim DataChild As IXMLDOMNode
    Dim DataChild2 As IXMLDOMNode
    Dim DataChild3 As IXMLDOMNode
    Dim DataChild4 As IXMLDOMNode
    If xDoc.Load(SystemInfoFileTxt.Value) Then
        ' The document loaded successfully.
        Set CategoryNode = xDoc.SelectSingleNode("/MsInfo/Category")
        Debug.Print CategoryNode.Attributes.getNamedItem("name").NodeValue
        For Each DataNode In CategoryNode.ChildNodes
            If DataNode.Attributes.length <> 0 Then
                Debug.Print DataNode.Attributes.getNamedItem("name").NodeValue
            End If
            For Each DataChild In DataNode.ChildNodes
                If DataChild.Attributes.length <> 0 Then
                    Debug.Print DataChild.Attributes.getNamedItem("name").NodeValue
                End If

                For Each DataChild2 In DataChild.ChildNodes
                    If DataChild2.HasChildNodes Then
                        If DataChild2.Attributes.length <> 0 Then
                            Debug.Print DataChild2.Attributes.getNamedItem("name").NodeValue
                        End If
                        For Each DataChild3 In DataChild2.ChildNodes
                            If DataChild3.HasChildNodes Then
                                If DataChild3.Attributes.length <> 0 Then
                                    Debug.Print DataChild3.Attributes.getNamedItem("name").NodeValue
                                End If
                                For Each DataChild4 In DataChild3.ChildNodes
                                    Debug.Print DataChild4.Text
                                Next DataChild4
                            Else
                                Debug.Print DataChild3.Text
                            End If
                        Next DataChild3
                    Else
                        Debug.Print DataChild2.Text
                    End If
                Next DataChild2

            Next DataChild
        Next DataNode
    End If
    Set xDoc = Nothing
End Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46309914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档