如何在VBA中parsingXML文件

我有以下格式的数据,并在Excel工作表中有类似的数据。

<LegalEntityDataVO> <LegalEntityDataVORow> <Name>Siemens Corporation</Name> <LegalEntityIdentifier>010</LegalEntityIdentifier> <EstablishmentData> <EstablishmentDataVORow> <MainEstablishmentFlag>Y</MainEstablishmentFlag> <Name>Siemens Corporation</Name> <GeographyCode>US</GeographyCode> <RegistrationDataEtb> <RegistrationDataEtbVORow> <SourceTable>XLE_ETB_PROFILES</SourceTable> <Name>United States Income Tax</Name> </RegistrationDataEtbVORow> <RegistrationDataEtbVORow> <SourceTable>XLE_ETB_PROFILES</SourceTable> <Name>United States Federal Tax</Name> </RegistrationDataEtbVORow> </RegistrationDataEtb> </EstablishmentDataVORow> </EstablishmentData> <EstablishmentData> <EstablishmentDataVORow> <MainEstablishmentFlag>Y</MainEstablishmentFlag> <Name>US Corporation</Name> <GeographyCode>US</GeographyCode> <RegistrationDataEtb> <RegistrationDataEtbVORow> <SourceTable>XLE_ETB_PAYBLES</SourceTable> <Name>United States Service Tax</Name> </RegistrationDataEtbVORow> <RegistrationDataEtbVORow> <SourceTable>XLE_ETB_PAYBLES</SourceTable> <Name>United States Oil Tax</Name> </RegistrationDataEtbVORow> </RegistrationDataEtb> </EstablishmentDataVORow> </EstablishmentData> </LegalEntityDataVORow> <LegalEntityDataVO> 

所以我的要求是比较Excel数据和XML数据。 具体来说,我的任务如下所述:

 If **LegalEntityIdentifier** value in Excel = **LegalEntityIdentifier** value in xml then ( If(**MainEstablishmentFlag** value in Excel = **MainEstablishmentFlag** value in Xml then ( Compare **Name** in Excel with **Name** in XML ) ) **LegalEntityIdentifier** childnode of LegalEntityDataVORow **MainEstablishmentFlag** childnode of EstablishmentDataVORow **Name** childnode of RegistrationDataEtbVORow 

这是我面临的问题:

  1. 每个LegalEntityDataVORow包含许多EstablishmentDataVORow
  2. 每个EstablishmentDataVORow包含许多RegistrationDataEtbVORow

在我的XML文件中,我有100 <LegalEntityDataVORow> 。 如何在VBA中运行上述任务?

以下代码将在输出下面的文件的代码下面生成输出:

码:

 Sub parse_data() Dim strXmlFileName As String: strXmlFileName = "Drive:\Path\Filename.xml" Dim docXmlDocument As New MSXML2.DOMDocument60 Dim wsDataToCompare As Worksheet: Set wsDataToCompare = ActiveWorkbook.Sheets("DataToCompare") Dim strLegalEntityIdentifierToCompare As String: strLegalEntityIdentifierToCompare = wsDataToCompare.Cells(1, 1).Value Dim strMainEstablishmentFlagToCompare As String: strMainEstablishmentFlagToCompare = wsDataToCompare.Cells(2, 1).Value Dim ndeEntityData As IXMLDOMNode Dim ndeEntityDataChild As IXMLDOMNode Dim ndeEstablishmentData As IXMLDOMNode Dim strNameToExtract As String docXmlDocument.Load strXmlFileName For Each ndeEntityData In docXmlDocument.DocumentElement.ChildNodes If ndeEntityData.SelectSingleNode("LegalEntityIdentifier").Text = strLegalEntityIdentifierToCompare Then For Each ndeEntityDataChild In ndeEntityData.ChildNodes If ndeEntityDataChild.BaseName = "EstablishmentData" Then If ndeEntityDataChild.SelectSingleNode("EstablishmentDataVORow/MainEstablishmentFlag").Text = strMainEstablishmentFlagToCompare Then strNameToExtract = ndeEntityDataChild.SelectSingleNode("EstablishmentDataVORow/Name").Text Debug.Print strNameToExtract End If End If Next ndeEntityDataChild End If Next ndeEntityData End Sub 

输出:

 Siemens Corporation US Corporation 

请注意,我必须再次展开您的XML文件才能使其有效。 我使用的文件是:

 <?xml version="1.0" encoding="UTF-8"?> <LegalEntityDataVO> <LegalEntityDataVORow> <Name>Siemens Corporation</Name> <LegalEntityIdentifier>010</LegalEntityIdentifier> <EstablishmentData> <EstablishmentDataVORow> <MainEstablishmentFlag>Y</MainEstablishmentFlag> <Name>Siemens Corporation</Name> <GeographyCode>US</GeographyCode> <RegistrationDataEtb> <RegistrationDataEtbVORow> <SourceTable>XLE_ETB_PROFILES</SourceTable> <Name>United States Income Tax</Name> </RegistrationDataEtbVORow> <RegistrationDataEtbVORow> <SourceTable>XLE_ETB_PROFILES</SourceTable> <Name>United States Federal Tax</Name> </RegistrationDataEtbVORow> </RegistrationDataEtb> </EstablishmentDataVORow> </EstablishmentData> <EstablishmentData> <EstablishmentDataVORow> <MainEstablishmentFlag>Y</MainEstablishmentFlag> <Name>US Corporation</Name> <GeographyCode>US</GeographyCode> <RegistrationDataEtb> <RegistrationDataEtbVORow> <SourceTable>XLE_ETB_PAYBLES</SourceTable> <Name>United States Service Tax</Name> </RegistrationDataEtbVORow> <RegistrationDataEtbVORow> <SourceTable>XLE_ETB_PAYBLES</SourceTable> <Name>United States Oil Tax</Name> </RegistrationDataEtbVORow> </RegistrationDataEtb> </EstablishmentDataVORow> </EstablishmentData> </LegalEntityDataVORow> </LegalEntityDataVO>