Итерация узлов XML с использованием VBA - PullRequest
2 голосов
/ 30 декабря 2010

Примечание: - Это может быть итерация узлов XML с использованием вопроса VBA. Пожалуйста, посмотрите внизу этого вопроса. Было бы хорошо, если бы мы могли выполнять итерации без использования MSXML2.DOMDocument

Я вижу вопрос this , который отвечает на часть моего вопроса о том, как получить CustomXMLPart. Тем не менее, я не могу перебрать Xml. Таким образом, это может быть не только для CustomXmlPart, это может быть итерация XML с использованием вопроса VBA. Ниже приведен XML-код, содержащийся в моем CustomXMLPart.

<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 ]

2 голосов
/ 04 января 2011

Хорошо, вот как я это сделал. Размещение на всякий случай, если это кому-нибудь пригодится. Очевидно, вам не нужно использовать объект «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
0 голосов
/ 03 января 2011

Я думаю, что причина того, что вы получаете ошибку несоответствия типов, в том, что ChildNodes возвращает IXMLDOMNodeList, а не XMLNodes.

Попробуйте Dim itemChildren As IXMLDOMNodeList вместо.

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

0 голосов
/ 03 января 2011

Использование:

Dim itemChildren As CustomXMLNodes

...