代码之家  ›  专栏  ›  技术社区  ›  jasttim

如何在AutoItV3中使用MSXML检索嵌入的XML值?

  •  0
  • jasttim  · 技术社区  · 7 年前

    我试图使用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 回复  |  直到 7 年前
        1
  •  1
  •   garbb    7 年前

    UDF的问题是,它似乎希望为所有内容返回字符串,而不是更有用的xml对象。我会避免使用它,而只是使用com对象 $oXml = ObjCreate("Msxml2.DOMDocument") 然后看看 documentation here .

    但无论如何,我认为这段代码会让你得到你想要的:

    ; 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可以使用vba/vbs中使用的所有com对象。当vba/vbs执行类似操作时 Set oXml = CreateObject("Msxml2.DOMDocument") 只需在autoit中执行以下操作: $oXml=ObjCreate(“Msxml2.DOMDocument”) .

    推荐文章