使用VBA迭代XML节点

时间:2010-12-30 18:28:32

标签: xml vba word-vba

注意: - 它可能是使用VBA问题的迭代XML节点。请看这个问题的底部。如果我们可以在不使用MSXML2.DOMDocument

的情况下进行迭代,那就太好了

我看到了this问题,该问题回答了关于如何检索CustomXMLPart的部分问题。但是,我无法遍历Xml。这样,这可能不是特定于CustomXmlPart,它可能是使用VBA问题的迭代XML。以下是我在CustomXMLPart中的XML。

<Items>
<Item1>Item1</Item1>
<Item2>Item2</Item2>
<Item3>Item3</Item3>
</Items>

这就是我将上述XML添加为CustomXmlPart的方法: -

static void AddCustomTableXmlPart(WordprocessingDocument document)
        {
            MainDocumentPart mainDocumentPart = document.MainDocumentPart;
            XDocument itemXml = GetItemsAsCustomXML();

            if (mainDocumentPart.GetPartsCountOfType<CustomXmlPart>() > 0)
                mainDocumentPart.DeleteParts<CustomXmlPart>(mainDocumentPart.CustomXmlParts);

            //Add a new customXML part and then add content
            var customXmlPart = mainDocumentPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);

            //copy the XML into the new part...
            using (var ts = new StreamWriter(customXmlPart.GetStream()))
            {
                ts.Write(itemXml.ToString());
                ts.Flush();
            }
        }

这就是我在宏中访问它的方式: -

Dim itemNode As xmlNode
Dim itemChildren As XMLNodes

'以下行引发运行时错误'运行时错误'13' - '类型不匹配'不确定原因。

**Set itemChildren= ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).SelectSingleNode("//Items").ChildNodes**

有趣的是,当我快速观看 ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).SelectSingleNode(“// Items”)。ChildNodes 时,我会在快速监视窗口中看到子项。对itemChildren变量的赋值是否不正确?

我想遍历所有项目并获取所有项目的文本。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

好的,我就是这样做的。发布以防万一对某人有用。显然,您不需要使用“CustomXMLNodes”对象。这仍然可以使用SelectNodes完成。以下功能显示了这一点。另外,在将项目添加到列表时,我没有检查空字符串。

Sub LoadItems()
     Dim totalItemsCount As Integer
     totalItemsCount = ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).SelectNodes("//Items")(1).ChildNodes.Count
     Dim item As String

     For i = 1 To totalItemsCount
        item = ActiveDocument.CustomXMLParts(ActiveDocument.CustomXMLParts.Count).SelectNodes("//Items")(1).ChildNodes(i).text
        item = Replace(item, " ", Empty)

        If Len(item) > 1 Then
        ItemUserControl.lstItems.AddItem pvargItem:item
        End If
     Next i
End Sub

答案 1 :(得分:0)

使用:

  

Dim itemChildren CustomXMLNodes

答案 2 :(得分:0)

我认为您收到类型不匹配错误的原因是因为ChildNodes返回IXMLDOMNodeList而不是XMLNodes

请尝试Dim itemChildren As IXMLDOMNodeList

http://msdn.microsoft.com/en-us/library/ms757053(v=vs.85).aspx