在VBA中提取XML节点名称

上下文

在一个Xml文件的例子中,一些数据的格式如下:

<A1> <B1> <c1>value</c1> <c2>value</c2> <c3>value</c3> </B1> <B2> <c1>value</c1> <c2>value</c2> <c3>value</c3> </B2> </A1> <A2> <B1> <c1>value</c1> <c2>value</c2> <c3>value</c3> </B1> <B2> <c1>value</c1> <c2>value</c2> <c3>value</c3> </B2> </A2> 

我的问题

我需要迭代节点以获得以下结果:

 A1B1C1 A1B1C2 A1B1C3 A1B2C1 A1B2C2 A1B2C3 

我尝试了很多次,但无法得到这个结果,任何人都可以帮助我这个谢谢。

首先我会推荐使用库“Microsoft XML,vx.x”,其中x代表可用的最新版本(应为6.0)。 之后,你很好去。 但是在VBA中使用XML时要考虑的事情要广泛地包含在答案中。 我将在这里提供代码来获得您想要的输出:

 Sub parse_xml() Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml" Dim XmlDocument As New MSXML2.DOMDocument60 Dim NodeA As IXMLDOMNode Dim NodeB As IXMLDOMNode Dim NodeC As IXMLDOMNode XmlDocument.Load XmlFileName For Each NodeA In XmlDocument.DocumentElement.ChildNodes For Each NodeB In NodeA.ChildNodes For Each NodeC In NodeB.ChildNodes Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName Next NodeC Next NodeB Next NodeA End Sub 

请注意,我不得不扩展你的文件一点点,以使其成为一个有效的XML文件,可以加载到XmlDocumentvariables。 我用于这个例子的Xml文件如下:

 <?xml version="1.0" encoding="UTF-8"?> <data> <A1> <B1> <c1>value</c1> <c2>value</c2> <c3>value</c3> </B1> <B2> <c1>value</c1> <c2>value</c2> <c3>value</c3> </B2> </A1> <A2> <B1> <c1>value</c1> <c2>value</c2> <c3>value</c3> </B1> <B2> <c1>value</c1> <c2>value</c2> <c3>value</c3> </B2> </A2> </data> 

这将生成以下输出(我刚刚使用了Debug.Print,如你所见):

 A1B1c2 A1B1c3 A1B2c1 A1B2c2 A1B2c3 A2B1c1 A2B1c2 A2B1c3 A2B2c1 A2B2c2 A2B2c3 

最后的附注:与Pierre所说的不同,我认为在VBA中parsingXML是相当可行的任务。 根据我的经验,您只需要我在post顶部推荐的库来进行文件的实际parsing。 我已经使用相当复杂的XML文件,只使用该库进行parsing。

编辑:这是代码,只会提取您所需的A标准的值:

 Sub parse_xml() Dim XmlFileName As String: XmlFileName = "C:\Path\Filename.xml" Dim XmlDocument As New MSXML2.DOMDocument60 Dim NodeA As IXMLDOMNode Dim NodeB As IXMLDOMNode Dim NodeC As IXMLDOMNode Dim DesiredA As String: DesiredA = "A2" 'Enter your desired A here XmlDocument.Load XmlFileName For Each NodeA In XmlDocument.DocumentElement.ChildNodes If NodeA.BaseName = DesiredA Then 'This is the new line that selects your desired A For Each NodeB In NodeA.ChildNodes For Each NodeC In NodeB.ChildNodes Debug.Print NodeC.ParentNode.ParentNode.BaseName & NodeC.ParentNode.BaseName & NodeC.BaseName Next NodeC Next NodeB End If 'End of the If-Statement Next NodeA End Sub