ошибка выполнения 91: переменная объекта не установлена ​​на CustomXMLnode - PullRequest
1 голос
/ 02 июня 2019

РЕДАКТИРОВАТЬ: эта ошибка решена.Смотрите ниже решение.

Я пытаюсь прочитать некоторые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...