处理具有相同 XPath 的多个 XML 元素

Posted

技术标签:

【中文标题】处理具有相同 XPath 的多个 XML 元素【英文标题】:Handling multiple XML elements with the same XPath 【发布时间】:2022-01-03 18:36:31 【问题描述】:

我在修改同一个 XML 中具有相同 Xpath 的多个元素时遇到问题。代码如下:

*** Settings ***
Library    XML
Library    String

*** Variables ***
$XMLpath   AbsolutePath.xml
$Xpath    GM/BODY/CMss/message  #(there are two elements with this xpath)

*** Test Cases ***
TestCase
    $root  Parse Xml  $XMLpath
    @CMmessage     Get Elements Text   $root  $Xpath
    
    $CMmessage1  Set Variable  @CMmessage[1]
       #...CMmessage1 modifications...
    Set  $root  $CMmessage1  \  $Xpath #Here is failing due there are multiple elements (2) matching the XPath
    
    $CMmessage2  Set Variable  @CMmessage[2]
       #...CMmessage2 modfications...
    Set  $root  $CMmessage1  \  $Xpath #Here is failing due there are multiple elements (2) matching the XPath

    Save Xml  $root  $XMLpath

有问题,Xpath给出的不是唯一的。我试过索引:

Set $root $CMmessage1 \ $Xpath[1] Set $root $CMmessage1 \ $Xpath[2]

但这没用...有人知道如何处理 Robotframework-XMLlibrary 中的索引吗?

【问题讨论】:

【参考方案1】:

您需要对这些元素进行一些处理。

使用Get Elements 关键字。

【讨论】:

您好 Helio,Get Elements 关键字会给我一个列表,其中包含所有具有相同路径的元素 OK。但是如果我想设置文本或设置任何属性(例如,将标签“message”替换为“message1”和“message2”)这是不可能的,因为设置属性使用路径,而不是元素...... 原则上,您可以像使用任何其他类型的定位器一样使用Get Elements 返回的对象。我“期待”与 SeleniumLibrary 中相同的行为,这是可能的。但是必须有一种方法来区分这些元素。否则,任何 API 或程序如何在它们上工作? IDK 在 SeleniumLibrary 中的行为。这是像这样的“$elements[0].Text”(使用获取元素而不是获取元素文本) 对不起,我只能做实验。【参考方案2】:

好的,我终于找到了问题所在。使用

Set  $root  $CMmessage1  \  $Xpath[1]

错了

@CMmes1     Get Element Text   $root  $Xpath
@CMmes2     Get Element Text   $root  $Xpath
...
Set  $root  $CMmes1  \  GM/BODY/CMss[1]/message
Set  $root  $CMmes2  \  GM/BODY/CMss[2]/message

没问题。关键是我有 2 个 CMmes,而不是 CMes 中的 2 个消息。

【讨论】:

以上是关于处理具有相同 XPath 的多个 XML 元素的主要内容,如果未能解决你的问题,请参考以下文章

PHP SIMPLEXML XPATH 匹配具有相同子字符串的多个标签

XML之XPath

RF库XML测试通过xpath查找元素的说明

XPATH 注入的介绍与代码防御

xpath语法

XPath注入