Как получить встроенные значения 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"),

Другие вопросы по тегам