VBA: извлечение данных XML из формы XFA и передача в синтаксический анализатор XML

Я пытаюсь извлечь XML-информацию из формы XFA с помощью VBA.

Приведенный ниже код работает для извлечения данных XML в отдельный файл, но требует взаимодействия с пользователем (пользователя просят указать имя файла XML). Я отказался от попыток автоматизировать это без взаимодействия с пользователем из-за требования Adobe «безопасный путь» (который кажется невозможным обойти с помощью автоматизации VBA).

Dim objPDDoc As New AcroPDDoc
Dim objJSO As Object
Dim strSafePath as String

strSafePath = ""

objPDDoc.Open (FileName)
Set objJSO = objPDDoc.GetJSObject
objJSO.xfa.host.exportdata strSafePath, 0

Я бы предпочел анализировать XML-информацию напрямую с помощью MSXML2.DOMDocument60. Я надеялся, что смогу сделать что-то вроде этого:

Dim XMLDoc As New MSXML2.DOMDocument60

If XMLDoc.Load(objJSO.xfa.host.exportdata) = True Then
    Call funcParse(XMLDoc)
End if

Однако загрузка XMLDoc с помощью objJSO.xfa.host.exportdata не работает, и я не могу понять, какие - если есть - возможности для передачи информации XML с использованием каких-либо методов / свойств xfa.host.

Любая помощь приветствуется - я также говорю, что это невозможно в VBA.


person CM2020    schedule 24.02.2020    source источник


Ответы (2)


Попробуйте что-то вроде этого:

myXMLstring = "<XML>BLA</XML>"
Dim xmlDoc As MSXML2.DOMDocument60
Set xmlDoc = New MSXML2.DOMDocument60
xmlDoc.LoadXML myXMLstring

См. Лучший пример: См., Например, это сообщение: https://desmondoshiwambo.wordpress.com/2012/07/03/how-to-load-xml-from-a-local-file-with-msxml2-domdocument-6-0-and-loadxml-using-vba/

person Koen Rijnsent    schedule 26.02.2020
comment
Спасибо, что ответил, Коэн. Но моя задача - извлечь XML, вложенный в XFA, чтобы я мог передать его в XMLDoc (через Load или LoadXML). Итак, используя ваш ответ в качестве примера; как мне сгенерировать myXMLstring из XML, вложенного в форму XFA? - person CM2020; 26.02.2020
comment
Ммм, в моей системе нет полной версии Acrobat, поэтому я не могу его протестировать. В документации есть подсказка. Путь не может указывать на критическую системную папку, например корень, Windows или системный каталог. Путь также подлежит другим неуказанным тестам. Для многих методов имя файла должно иметь расширение, соответствующее типу данных, которые необходимо сохранить. Некоторые методы могут иметь запрет на перезапись. Эти дополнительные ограничения указаны в документации. Итак, вы можете попробовать несколько местоположений и имен файлов, чтобы увидеть, что работает, и после этого прочитать / загрузить этот файл (и удалить его)? - person Koen Rijnsent; 27.02.2020
comment
Спасибо за ваши мысли об этом Коэне. Мне еще не удалось найти путь, который позволил бы мне автоматически сохранить XML-файл. Поэтому я надеялся, что передача XML-данных в синтаксический анализатор без необходимости их сохранения будет более простым решением. Однако ваше предложение может быть лучшим шансом на успех. - person CM2020; 02.03.2020

Оригинальный плакат здесь. Примерно через год изучения этого вопроса я нашел решение.

Получив доступ к объекту JavaScript через AccroPDDoc.GetJSObject, я могу извлечь вложенный XML в виде строки с помощью objJSO.xfa.this.saveXML.

Таким образом, мне не нужно сначала сохранять вложенный XML в файл (что потребует взаимодействия с пользователем) - вместо этого я могу немедленно извлечь вложенный XML и передать его синтаксическому анализатору.

Dim objPDDoc as New AcroPDDoc
Dim objJSO as Object
Dim XMLDoc As New MSXML2.DOMDocument60

ObjPDDoc.Open (Filename)
Set objJSO = objPDDoc.GetJSObject
If XMLDoc.LoadXML (objJSO.xfa.this.saveXML) = True then
     ParseXML(XMLDoc)
End if
person CM2020    schedule 16.02.2021