通过 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)"}
三个问题:
- XPath 表达式中不应有尾随
/
。
- 每个元素名称应该只有一个命名空间前缀,而不是两个。
- 根据您的 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
命名空间前缀,以及 z
到 y
更改的命名空间前缀。
您可能希望为 soap 信封使用比 x
更传统的前缀(soapenv
、env
、soap
等),但是命名空间前缀是任意的,只要它的使用匹配它声明的绑定到重要部分,命名空间 URI 值本身。
另见
- Does having a different name for the XML namespace prefix matter?
我有一个要求,需要从 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)"}
三个问题:
- XPath 表达式中不应有尾随
/
。 - 每个元素名称应该只有一个命名空间前缀,而不是两个。
- 根据您的 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
命名空间前缀,以及 z
到 y
更改的命名空间前缀。
您可能希望为 soap 信封使用比 x
更传统的前缀(soapenv
、env
、soap
等),但是命名空间前缀是任意的,只要它的使用匹配它声明的绑定到重要部分,命名空间 URI 值本身。
另见
- Does having a different name for the XML namespace prefix matter?