Как получить встроенные значения XML с помощью MSXML в AutoItV3?
Я пытаюсь использовать AutoItV3 для автоматизации вставки некоторых сущностей в программное обеспечение.
Будет гораздо проще, если моя автоматизация сможет считывать информацию из файла xml и использовать ее для генерации моих сущностей, поскольку тогда я смогу анализировать разные файлы xml для разных тестов.
Я использую популярное расширение MSXML, чтобы попытаться сделать это. Это можно найти здесь: https://www.autoitscript.com/forum/applications/core/interface/file/attachment.php?id=44418
Мой XML - это относительно простая структура, где у меня будут различные поля под каждым "объектом" во всех моих "объектах"
<?xml version="1.0" encoding="UTF-8"?>
<entities>
<entity>
<name>
Mation Jr, Mr Auto
</name>
<legalname>
Mr Auto Mation Jr
</legalname>
</entity>
<entity>
<name>
Mation Sr, Mr Auto
</name>
<legalname>
Mr Auto Mation Sr
</legalname>
</entity>
</entities>
В моем заголовке сценария я импортирую файл MSXML au3 и задаю путь XML
#include <_MSXML.au3>
; Set the XML file
$xmlpath = @ScriptDir & "\Entity.xml"
У меня вопрос, как я могу перебирать атрибуты каждого объекта во всех объектах?
Это то, что я имею до сих пор, но я не понимаю, как мне получить значения от отдельной сущности, перечисленной в узле сущностей:
; Fetch All Entities from XAML
$ENTITIES = _MSXML_SelectNodes($oXml, "entities/entity")
If ($ENTITIES[0] > 0) Then
; This part works and will iterate for x amount of entities provided
; Fetch Entity as pos $i
For $i = 1 To $ENTITIES[0] Step 1
; How can I iterate through attributes from ENTITIES[$i] ??
Next
Else
MsgBox(4096, 'Error', 'No entity was provided')
EndIf
Я понимаю, что мой вопрос довольно широк, но я думаю, что должно быть достаточно информации, чтобы начать с
1 ответ
Эта проблема с этим UDF заключается в том, что он хочет возвращать строки для всего, а не для объектов XML, которые более полезны. Я хотел бы избежать этого, и вместо этого просто использовать объект com самостоятельно с $oXml = ObjCreate("Msxml2.DOMDocument")
а затем посмотрите на документацию здесь.
Но в любом случае, я думаю, что этот код даст вам то, что вы хотите:
; Set the XML file
$xmlpath = @ScriptDir & "\Entity.xml"
$oXml = ObjCreate("Msxml2.DOMDocument")
$oXml.load($xmlpath)
; Fetch All Entities from XAML
$objNodeList = $oXml.selectNodes("entities/entity")
For $node in $objNodeList
ConsoleWrite($node.nodename & @CRLF)
$objChildNodeList = $node.selectNodes("*")
For $ChildNode in $objChildNodeList
ConsoleWrite(@TAB & $ChildNode.nodename & ' = ' & $ChildNode.text & @CRLF)
Next
Next
Обратите внимание, что в действительности нет необходимости использовать UDF, и вы можете просто использовать встроенные методы объекта com. На мой взгляд, это проще, чем использовать UDF.
В общем, стоит упомянуть, что если вам когда-нибудь будет трудно понять, как сделать что-то в autoit, вы можете попытаться найти то же самое в vba или vbs, поскольку языки очень похожи, и autoit может использовать все com объекты, которые используются в vba/vbs. Когда VBA / VBS делает что-то вроде этого Set oXml = CreateObject("Msxml2.DOMDocument")
просто сделайте это в autoit: $oXml = ObjCreate("Msxml2.DOMDocument")
,