如何在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
这是我面临的问题:
- 每个
LegalEntityDataVORow
包含许多EstablishmentDataVORow
- 每个
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>