xml()函数将合法XML字符串转为XML对象用于解析或发送,不生成复杂XML;需确保根节点存在、引号统一、特殊字符转义。

Power Automate 中用 xml() 函数生成结构化 XML
Power Automate 本身不提供原生的 XML 构建控件,但可通过 xml() 函数将 JSON 字符串安全转为 XML 对象(用于后续解析或发送),或用字符串拼接 + xml() 校验来构造简单 XML。关键点是:输入必须是合法的 XML 字符串,且函数只做解析/转换,不负责生成带命名空间或复杂嵌套的格式。
常见错误是直接拼接字符串后未加根节点、属性引号不统一(单引号 vs 双引号)、特殊字符(如 &、)未转义,导致 xml() 报错 "The provided value is not a valid XML string"。
- 先用
concat()拼出完整 XML 字符串,确保根元素存在、所有属性值用双引号包裹 - 用
replace()手动转义:replace(replace(bodyString, '&', '&'), ' - 再传给
xml()—— 这步失败说明字符串仍非法,不是函数问题 - 若需带命名空间(如
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"),必须写在根元素内,不能单独追加
xml(concat( '', ' ' ))', triggerBody()?['id'], ' ', '', triggerBody()?['approverEmail'], ' ', '
Logic Apps 中用 Xml 操作和 XSLT 转换生成合规 XML
Logic Apps 的 Xml 操作(非 XML Parse)支持从 JSON Schema 生成 XML,更适合构建标准审批 XML 文件。它会自动处理命名空间、空值省略、类型映射(如布尔值转 true/false 字符串)。但前提是:你得先定义好 schema —— 没有 schema 就无法触发该操作。
容易被忽略的是:schema 中的 required 字段若在输入 JSON 中缺失,整个 Xml 操作会失败,而不是静默跳过。另外,Xml 操作不支持动态命名空间前缀(如 ns0:xxx),只能靠 schema 里 targetNamespace 统一声明。
- 在 Logic App 设计器中添加
Xml操作,点击Use sample payload to generate schema,粘贴一个示例 JSON - 手动编辑生成的 schema,补全
targetNamespace和elementFormDefault="qualified" - 输入数据必须是 JSON 对象(不能是字符串),且字段名严格匹配 schema 中
name - 如需定制格式(如固定缩进、CDATA 包裹文本),改用
XSLT操作,传入 XSLT 1.0 脚本
审批环节如何把 XML 内容作为邮件/Teams 消息体发送
XML 是纯文本,但直接放进邮件正文会被浏览器渲染成空白(因为标签被当 HTML 解析)。Power Automate 的 Send an email (V2) 或 Logic Apps 的 Office 365 Outlook - Send an email 默认启用 HTML 渲染,必须显式关闭或转义。
- 在邮件正文中使用
replace(replace(xmlString, '', 'youjiankuohaophpcn')手动 HTML 转义 - 或改用
Plain text模式(Power Automate 邮件操作里勾选Is HTML为 false) - Teams 消息不支持预格式化 XML,建议用
code块包装:```xml ```- val
- 若需用户下载 XML 文件,别用附件直传 —— 先用
base64()编码字符串,再用Create file(OneDrive/SharePoint)存为 .xml 后缀
审批通过后如何解析并提取 XML 中的关键字段
审批动作(Start and wait for an approval 或 Logic Apps 的 Approval)返回的是 JSON,其中 responses 是审批人填写的内容,但原始 XML 数据不会自动拆解。你得自己用 xml() + xpath() 提取字段 —— 这步常因命名空间或路径错误失败。
- 先确认 XML 是否含默认命名空间(如
xmlns="http://ns"),若有,xpath()必须声明前缀:xpath(xmlBody, 'declare namespace ns="http://ns"; //ns:RequestID/text()') - 若 XML 有 CDATA 段,
xpath()仍可提取内容,无需额外处理 - 避免用
//全局搜索,性能差且易匹配到意外节点;优先用绝对路径/root/RequestID - 提取结果是数组,即使只有一个节点也要用
first()或索引[0]取值,否则后续操作可能报类型错误
xpath( xml(triggerBody()?['data']?['xmlContent']), 'declare namespace ns="https://example.com/schema"; //ns:Approver/text()' )
实际跑通的关键不在“怎么生成”,而在于每一步的 XML 合法性校验是否到位——拼接后立刻用 xml() 封装,失败就停,别等到发出去才报错。命名空间、转义、schema 一致性,三者漏一个,后面所有解析都会卡住。











