【问题标题】:XML Library Get Element Attributes not returning attribute valuesXML 库获取元素属性不返回属性值
【发布时间】:2021-07-16 17:09:55
【问题描述】:

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

XML 内容是作为 Telnet 消息提供的,我只是在读取输出,如果接收到某些内容,则尝试使用 XML 库对其进行解析。输出应该与 XML Schema 匹配(在其他地方验证),所以我不必担心格式。

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>

我曾尝试将 Robot Framework 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

然后属性列表只返回以下

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

我知道这些属性通常仅适用于声明它们的元素,但我无法完全理解为什么我根本没有获得 type 的值。

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

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

【问题讨论】:

  • 留下这个作为评论,因为我无法测试这是否真的解决了这个问题,但是在安装 Python 3.9.2 时我不再遇到这个问题 - 不是使用 ElementTree 或 lxml 实现。两者都按预期以字典格式返回了 type 值。

标签: xml robotframework


【解决方案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 时,第一个元素将是“版本”,因此不会有相同的值供您读取。

【讨论】:

  • 问题不在于我无法获取任何元素的元素文本。我能够从元素中获取文本内容,但在某些情况下,在运行我应该寻找哪个 items 元素之前,我无法确定。问题仍然存在,如果我应该做一些不同的事情来从items 元素上声明的xsi:noNamespaceLocation 中获取值。也使用此信息更新了问题。
【解决方案2】:

因此,我似乎偶然发现了 Robot 最基本的基本错误。 事实证明,将字典作为列表调用只会为您提供您请求的键列表。

换行

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

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

问题已解决。

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    相关资源
    最近更新 更多