РЕДАКТИРОВАТЬ: эта ошибка решена.Смотрите ниже решение.
Я пытаюсь прочитать некоторые customXML-узлы из customXMLpart, используя VBA для заполнения некоторых элементов управления контентом в Microsoft word.Для приведенного ниже примера кода я просто печатаю непосредственное окно при попытке отладить эту проблему.
Я могу сделать это без проблем, когда я читаю customXMLnode, который находится внутри customXMLpart, у которой нет пространства имен.Тем не менее, при попытке прочитать узел в customXMLpart, который имеет пространство имен, я получаю ошибку времени выполнения 91 (переменная объекта не установлена) в строке, где он пытается вывести в непосредственное окно (см. Мои комментарии в примере кода ниже).Я установил точку останова до этого, чтобы попытаться выяснить это, и это показывает, что для узла (cxn в моем коде ниже) задано значение Nothing.Я не уверен, что я делаю неправильно.
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<People xmlns="people">
<Person>
<Name> bob </Name>
<Street> Main St. </Street>
</Person>
</People>`
VBA:
Dim cxp1 As CustomXMLParts
Dim cxn As CustomXMLNode
' Returns all of the custom xml parts with the given namespace.
Set cxp1 = ActiveDocument.CustomXMLParts.SelectByNamespace("people")
' Get the node matching the XPath expression.
Set cxn = cxp1(1).SelectSingleNode("/People/Person/Name")
'executing the line below gives me run-time error 91 (object variable not
'set). And cxn shows that it is set to Nothing.
Debug.Print cxn.Text
По сути, я получил этот код с веб-сайта Microsoft https://docs.microsoft.com/en-us/office/vba/api/office.customxmlparts.selectbynamespace и сделал нескольконебольшие изменения для моего конкретного XML.
Я считаю, что у меня есть правильные операторы Dim и Set, поэтому неясно, почему я получаю эту ошибку.Я знаю, что XML хорош, потому что я могу читать его, когда нет пространства имен при использовании VBA, следующим образом:
Dim parts As CustomXMLParts
Dim part As CustomXMLPart
Dim nodes As CustomXMLNodes
Dim node As CustomXMLNode
Set parts = ActiveDocument.CustomXMLParts
For Each part In parts
If Len(part.NamespaceURI) = 0 Then
Set node = part.SelectSingleNode("/People/Person/Name")
debug.Print = node.Text
Любой совет очень ценится!
РЕДАКТИРОВАТЬ: эта ошибка устранена.Я потратил смущающее количество времени, пытаясь понять это, так что, надеюсь, кому-то другому это не понадобится.Вот что я сделал неправильно:
для чтения части customXML с пространством имен, в котором Xpath на узле должен включать префикс XML.Это сбивало с толку, потому что у меня не было префикса, но, видимо, слово MS назначает его.Поэтому вы должны получить префикс CustomXMLpart в виде строковой переменной и изменить выражение Xpath, используя эту переменную, следующим образом:
Dim cxp1 As CustomXMLParts
Dim cxn As CustomXMLNode
Dim prefix As String
' Returns all of the custom xml parts with the given namespace.
Set cxp1 = ActiveDocument.CustomXMLParts.SelectByNamespace("people")
prefix = cxp1(1).NamespaceManager.LookupPrefix("people")
' Get the node matching the XPath expression using the prefix variable (even
'if you don't explicitly set a prefix you must include a prefix)
Set cxn = cxp1(1).SelectSingleNode("/" & prefix & ":" & People & "/" & prefix &
":" & Person & "/" & prefix & ":" & Name")
Debug.Print cxn.Text