2017-09-19 5 views
1

MSInfo32 XML 파일에서 데이터를 가져 오려고합니다. "소프트웨어 환경"아래의 "구성 요소"/ "저장 영역"및 "프로그램 그룹"아래의 "시스템 요약", "드라이브"만 가져 오려고합니다.액세스 용 VBA에서 XML (MSInfo32) 읽기

여기
<?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> 

이 불쌍한 내 코드입니다 : 여기

는 XML 파일의 조각입니다 내가 작은 XML 파서를 작성했습니다

+0

원하는 결과에 대한 자세한 명시 해주십시오 MSXML2의 6.0 초기 바인딩로 전환했습니다. 그게 무슨 일을하는지, 어떤 일을하기를 원합니까, 어떤 실수라도, 어떤 특정한 어려움이 있니? –

+0

안녕하세요 Eric, "System Summary"속성, "Program Groups"속성이있는 세 번째 레벨 요소 및 "Drive"속성이있는 네 번째 레벨 요소가있는 첫 번째 레벨 요소를 출력하고 싶습니다. 지금까지 "시스템 요약"속성이있는 첫 번째 레벨 노드 만 읽을 수 있습니다. –

+0

좀 더 구체적으로 작성하십시오. 따라서 원하는 출력은이 샘플 데이터 "Windows 10 Pro", "C :"및 "Default"또는 그 밖의 항목에 대한 목록입니다. 목록 상자 컨트롤에 DOM 요소가 포함될 수 없기 때문에 결과가 목록 상자 컨트롤에 항목을 추가하는 경우 DOM 요소를 묻지 마십시오. –

답변

1

사전에

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 

덕분에 그 최대 4 레벨까지 노드를 통과하고, 존재하는 경우 name 속성을 인쇄하고, 자식 노드가없는 경우 내용을 인쇄합니다 (재귀 적으로 쓰기는 아마도 l 에세이 노력이 있지만, 이것은 사용자 정의하기가 더 쉽습니다).

원하는 동작과 유사합니다. 몇 가지 맞춤 설정이 필요할 것입니다. 그러나 출력 결과에 시스템이 정확하게 적용되지 않기 때문에 사용자를 대신 할 수는 없습니다.

는 또한

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 
+0

정말로 감사합니다. 나는 그것을 시도 할 것이고 만약 내가 그것을 원하는 방식으로 커스터마이징한다. –