RobotFramework解析带前缀XML报前缀未找到错误解决方法
错误原因
使用use_lxml=yes模式的Robot Framework XML库执行XPath查询时,不会自动读取XML文档内声明的命名空间前缀映射,直接写文档里的前缀会触发prefix not found in prefix map报错。另外原脚本存在两处语法问题:
- 第二个
Set Element Text的入参DEFGSUV12345678910和xpath=之间漏了空格分隔 <NAMESPACE:Waitforrevert>节点下的子节点属于默认命名空间urn:xyz:std:xyz:2022:tech:xsd:abcd.123.001.01,直接写无命名空间前缀的节点名无法匹配
正确实现方案
方案1:注册命名空间后匹配(推荐,XPath可读性高)
解析XML后先通过Register Namespace关键字注册所有用到的命名空间前缀与对应URI,再写带前缀的XPath匹配节点即可,完整脚本如下:
*** Settings *** Library XML use_lxml=yes *** Variables *** ${IN_The_Path} 你的输入XML文件路径 ${Path2} 你的输出XML文件路径 *** Test Cases *** xml_with_namespace ${y}= Parse Xml ${IN_The_Path} # 注册原XML中NAMESPACE前缀对应的命名空间URI Register Namespace NAMESPACE urn:NAMESPACE:xsd:$RAIseQuery # 为Waitforrevert节点下的默认命名空间注册临时前缀std Register Namespace std urn:xyz:std:xyz:2022:tech:xsd:abcd.123.001.01 # 修改Ref节点文本 Set Element Text ${y} XYZ2345678 xpath=.//NAMESPACE:Ref # 修改Id节点文本,子节点需加注册的std前缀 Set Element Text ${y} DEFGSUV12345678910 xpath=.//NAMESPACE:Waitforrevert/std:START1/std:Id Save Xml ${y} ${Path2}
方案2:用local-name()匹配(无需注册多命名空间)
如果不想维护命名空间映射,可以在XPath中用local-name()忽略命名空间匹配节点,不需要注册Waitforrevert下的默认命名空间,修改Id节点的写法如下:
Set Element Text ${y} DEFGSUV12345678910 xpath=.//NAMESPACE:Waitforrevert/*[local-name()='START1']/*[local-name()='Id']
两种方案执行后输出的XML都和预期结构完全一致,不会改动原文件的命名空间声明和其他节点内容。
内容的提问来源于stack exchange,提问作者user19329477
相关产品推荐
相关产品推荐

