循环一个重复的节点列表,检查一个元素是否不存在,并返回一个空的值给Excel

<rootElement> <n0:Partner> <n1:Identifier>EMH38</n1:Identifier> <n1:A> <n1:B> <n1:C>WZFR8</n1:C> <n1:D>Coll</n1:D> <n1:E>1</n1:E> </n1:B> <n1:B> <n1:C>X3HV7</n1:C> <n1:D>Coll</n1:D> <n1:E>2</n1:E> </n1:B> <n1:B> <n1:C>X5E86</n1:C> <n1:D>Coll</n1:D> <n1:E>3</n1:E> </n1:B> <n1:B> <n1:C>X5FC6</n1:C> <n1:D>Coll</n1:D> </n1:B> <n1:B> <n1:C>X5FL6</n1:C> <n1:D>Coll</n1:D> <n1:E>5</n1:E> </n1:B> </<n1:A> </n0:Partner> 

我正在使用下面提到的xPathexpression式将上述XML读取到Excel工作表中

  ./n1:A/n1:B/n1:C ./n1:A/n1:B/n1:D ./n1:A/n1:B/n1:E 

由于元素E在第四个节点集(参考C = X5FC6的节点块)中缺失,我希望在相应的Excel单元格中看到空值,即,

  Expected output ---------------- CDE WZRF8 Coll 1 X3HV7 Coll 2 X5E86 Coll 3 X5FC6 Coll X5FL6 Coll 5 

有人可以提供一个关于如何完成这个输出的提示。 我使用加载XML文档,设置名称空间,select节点,然后标识元素节点的步骤。

然而,这一努力产生了以下结果

  Actual Output -------------- CDE WZRF8 Coll 1 X3HV7 Coll 2 X5E86 Coll 3 X5FC6 Coll 5 X5FL6 Coll 

你可以先selectB-nodes ,然后循环selectC,D,E然后检查Nothing例如这样。

在您的VBA-Project中添加对Microsoft XML的引用

 Option Explicit Private Const xml As String = "C:\Temp\Sample1.xml" Private xmlDoc As MSXML2.DOMDocument Private partner As MSXML2.IXMLDOMElement Private nodesB As MSXML2.IXMLDOMSelection Private nodeB As MSXML2.IXMLDOMElement Private nodeC As MSXML2.IXMLDOMElement Private nodeD As MSXML2.IXMLDOMElement Private nodeE As MSXML2.IXMLDOMElement Public Sub LoadXmlData() Set xmlDoc = New MSXML2.DOMDocument If Not xmlDoc.Load(xml) Then Err.Raise xmlDoc.parseError.ErrorCode, , xmlDoc.parseError.reason End If Set partner = xmlDoc.DocumentElement.SelectSingleNode("n0:Partner") Set nodesB = partner.SelectNodes("./n1:A/n1:B") Dim r As Integer r = 1 ActiveSheet.Cells(r, 1) = "C" ActiveSheet.Cells(r, 2) = "D" ActiveSheet.Cells(r, 3) = "E" For Each nodeB In nodesB Set nodeC = nodeB.SelectSingleNode("./n1:C") Set nodeD = nodeB.SelectSingleNode("./n1:D") Set nodeE = nodeB.SelectSingleNode("./n1:E") r = r + 1 If Not nodeC Is Nothing Then ActiveSheet.Cells(r, 1) = nodeC.Text End If If Not nodeD Is Nothing Then ActiveSheet.Cells(r, 2) = nodeD.Text End If If Not nodeE Is Nothing Then ActiveSheet.Cells(r, 3) = nodeE.Text End If Next nodeB End Sub 

Sample1.xml中的示例数据

 <rootElement xmlns:n0="http://www.w3.org/n0/" xmlns:n1="http://www.w3.org/n1/"> <n0:Partner> <n1:Identifier>EMH38</n1:Identifier> <n1:A> <n1:B> <n1:C>WZFR8</n1:C> <n1:D>Coll</n1:D> <n1:E>1</n1:E> </n1:B> <n1:B> <n1:C>X3HV7</n1:C> <n1:D>Coll</n1:D> <n1:E>2</n1:E> </n1:B> <n1:B> <n1:C>X5E86</n1:C> <n1:D>Coll</n1:D> <n1:E>3</n1:E> </n1:B> <n1:B> <n1:C>X5FC6</n1:C> <n1:D>Coll</n1:D> </n1:B> <n1:B> <n1:C>X5FL6</n1:C> <n1:D>Coll</n1:D> <n1:E>5</n1:E> </n1:B> </n1:A> </n0:Partner> </rootElement> 

产量

 CDE WZFR8 Coll 1 X3HV7 Coll 2 X5E86 Coll 3 X5FC6 Coll X5FL6 Coll 5