我正在尝试从MSInfo32 XML文件导入数据。我只想导入"System Summary“、"Component"/"Storage”下的"Drives“和"Software Environment”下的"Program Group“。
以下是xml文件的片段:
<?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>下面是我糟糕的代码:
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提前感谢
发布于 2017-09-21 03:23:01
我已经编写了一个小的XML解析器,它只运行4层深度的节点,如果有name属性,就打印它的内容,如果它没有子节点,就打印它的内容(编写一个递归的解析器可能会花费更少的精力,但这更容易定制)。
这近似于您想要的行为。您将需要进行一些自定义,但因为我不能准确地在您的输出中获得系统,所以我不能为您执行此操作。
我还切换到了MSXML2 v6.0和早期绑定
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 Subhttps://stackoverflow.com/questions/46309914
复制相似问题