XML 库获取元素属性不返回属性值

XML Library Get Element Attributes not returning attribute values

我对 XML 比较陌生,我正在尝试创建自动测试用例来检查收到的 XML 消息是否包含正确结构的正确数据。 XML 消息由多个模式实例组成,某些标记在这些实例中是通用的。在某些情况下,我不知道应该在 运行 之前检查哪个名称空间,这使我无法简单地使用索引来查找元素。我需要获取我正在读取的当前实例的命名空间,以便能够确定这是否是我需要的元素。

XML 内容作为 Telnet 消息提供,我只是阅读输出,如果收到某些内容,则尝试使用 XML 库对其进行解析。输出应该匹配 XML 架构(在别处验证),所以我不必担心格式问题。

XML 看起来像这样

<?xml version="1.0" encoding="iso-8859-1"?>
<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceLocation="MessageA1.xsd">
    <version>1.0</version>
    <items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MessageInfo">
        <itemID>111111</itemID>
        <stuff>content</stuff>
    </items>
    <items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="MessageContent">
        <itemID>121212</itemID>
        <stuff>different content</stuff>
    </items>
</Message>

我曾尝试将机器人框架 XML 库与默认的 ElementTree 以及 lxml 一起使用,但(毫不奇怪)两者都提供了相似的结果。测试脚本如下所示

*** Settings ***
Library    XML    use_lxml=True
Library    String
Library    Collections
Library    Telnet

*** Test Cases ***
Get Element Namespace
    ${MESSAGE}=    Read
    ${XML}=    Parse XML    ${MESSAGE}
    ${ELEMENTS}=    Get Elements    ${XML}    //items
    FOR    ${ELEMENT}    IN    @{ELEMENTS}
        @{ATTRIBUTES}=    Get Element Attributes    ${ELEMENT}
    END

属性列表然后returns仅在

之后
@{ATTRIBUTES} = [ {http://www.w3.org/2001/XMLSchema-instance}type ]

我知道属性通常只对声明它们的元素可用,但我不能完全理解为什么我根本得不到 type 的值。

读取 XML Library Documentation 返回的值应该是一个 Python 字典,但这里不是这种情况 - XML 格式有问题还是我误解了什么?

使用 Python 3.8.7 和 Robot Framework 4.0.1 时遇到此问题。

这个有效:

    *** Settings ***
Library    XML    use_lxml=True
Library    String
Library    Collections

*** Test Cases ***
Get Element Namespace
    ${XML}=    Parse XML    xml_example.xml
    ${element}    Get Element Text    ${XML}    //items[1]/itemID
    Log    ${element}

只是不要忘记,当您获取所有元素和 运行 FOR 时,第一个元素将是“版本”,因此不会有相同的值供您阅读。

看来我无意中发现了 Robot 的最基本错误。 事实证明,将字典称为列表只会为您提供您请求的键列表。

通过换行

@{ATTRIBUTES}=    Get Element Attributes    ${ELEMENT}

${ATTRIBUTES}=    Get Element Attributes    ${ELEMENT}

问题已解决。