通过 Ansible playbook for SOAP 出现 XPath 语法错误 XML

XPath syntax error via Ansible playbook for SOAP XML

我有一个要求,需要从 XML 文件中读取一个元素。文件中的内容包含 SOAP 内容。从文件中读取元素时,定义的 XPath 给出如下错误:

fatal: [localhost]: FAILED! => {"changed": false, "msg": "Syntax error in xpath expression: `/x:soap:Envelope/x:soap:Body/z:WebService_Response/z:WebService_GenericResult/` (Invalid expression)"}

Ansible 任务:

- name: read value from the ayehu xml
  xml:
    path: ./ayehu_rest_out.xml
    xpath: /x:soap:Envelope/x:soap:Body/y:WebService_Response/y:WebService_GenericResult/
    content: text
    namespaces:
            x: "http://schemas.xmlsoap.org/soap/envelope/"
            y: "http://WebService.domain.com/"
  register:  xml_value_content
- debug:
      var:  xml_value_content

XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http:/ /www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <WebService_Response xmlns="http://WebService.domain.com/">
         <WebService_GenericResult>
      STATE=STOPPED------COMMENTS=Cant startup as Ayehu did not shutdown this database
         </WebService_GenericResult>
      </WebService_Response>
   </soap:Body>
</soap:Envelope>

我需要获取值 "STATE=STOPPED------COMMENTS=Cant startup as Ayehu did not shutdown this database"

更新:

这是ansible更新后的代码:

- name: read value from the ayehu xml
  xml:
    path: ./ayehu_rest_out.xml
    xpath: /env:Envelope/env:Body/y:WebService_Response/y:WebService_GenericResult/
    content: text
    namespaces:
           env: "http://schemas.xmlsoap.org/soap/envelope/"
           y: "http://WebService.domain.com/"
  register:  xml_value_content

- debug:
    var:  xml_value_content

错误:

TASK [read value from the ayehu xml] ******************************************************  
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Syntax error in xpath expression: /env:Envelope/env:Body/y:WebService_Response/y:WebService_GenericResult/ (Invalid expression)"}

三个问题:

  1. XPath 表达式中不应有尾随 /
  2. 每个元素名称应该只有一个命名空间前缀,而不是两个。
  3. 根据您的 Ansible 声明,命名空间前缀 z 应该是 y

根据您的 Ansible 代码定义的命名空间前缀,

namespaces:
        x: "http://schemas.xmlsoap.org/soap/envelope/"
        y: "http://WebService.domain.com/"

改变

/x:soap:Envelope/x:soap:Body/z:WebService_Response/z:WebService_GenericResult/ 

/x:Envelope/x:Body/y:WebService_Response/y:WebService_GenericResult 

注意删除尾随 /、删除 soap 命名空间前缀,以及 zy 更改的命名空间前缀。

您可能希望为 soap 信封使用比 x 更传统的前缀(soapenvenvsoap 等),但是命名空间前缀是任意的,只要它的使用匹配它声明的绑定到重要部分,命名空间 URI 值本身。

另见

  • Does having a different name for the XML namespace prefix matter?