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}
问题已解决。
我对 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}
问题已解决。