将mule服务器从3.9.1迁移到3.9.5后,我在payload到xml的转换中遇到了问题。
这是我的代码:
<flow name="SetVariablesFromPBGB">
<foreach collection="#[xpath3('/*:Envelope/*:Header',payload,'NODESET')]" doc:name="For Each">
<mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
<mulexml:xslt-transformer xsl-file="removeNameSpace.xslt" maxIdleTransformers="2" maxActiveTransformers="5" doc:name="XSLT"/>:
<set-variable variableName="soapHeader" value="#[System.getProperty('line.separator')]#[message.payloadAs(java.lang.String)]"/>
</foreach>
</flow>
dom-to-xml-transformer 不会将负载转换为 xml:
在这一行之后,有效载荷仍然是 [soapenv:Header: null] 而不是 :
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Header>
</soapenv:Header>
最佳答案
我的理解是,您想要获取带有前缀 soapEnv:
但没有 namespace 声明的 soapEnv:Header 元素。根据 XML Namespaces specification,我不确定命名空间是否有效:
The namespace prefix, unless it is xml or xmlns, MUST have been declared in a namespace declaration attribute in either the start-tag of the element where the prefix is used or in an ancestor element (i.e., an element in whose content the prefixed markup occurs).
如果声明命名空间是可以接受的,则此 DataWeave 脚本可以替换流的主体:
<dw:transform-message doc:name="Transform Message">
<dw:input-payload mimeType="application/xml" />
<dw:set-payload><![CDATA[%dw 1.0
%dw 1.0
%output application/xml
---
payload.Envelope.*Header
]]>
</dw:set-payload>
</dw:transform-message>
输入:
<soapenv:Envelope xmlns:soapenv="schemas.xmlsoap.org/soap/envelope"> <soapenv:Header><t>a</t></soapenv:Header> <soapenv:Body> <import> <data><![CDATA[ <AAA> <BBB></BBB> </AAA>]]></data> </import> </soapenv:Body> </soapenv:Envelope>
输出:
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Header xmlns:soapenv="schemas.xmlsoap.org/soap/envelope">
<t>a</t>
</soapenv:Header>
如果您想完全删除 XML 命名空间,您可以使用改编自此 blog 的方法通过使用递归函数。这将完全删除 namespace 声明和前缀。
%dw 1.0
%output application/xml
---
Header: payload.Envelope.Header
输出(对于上面相同的输入):
<?xml version='1.0' encoding='UTF-8'?>
<Header>
<t>a</t>
</Header>
这些是您可以执行的有效 XML 输出。
不推荐:如果您绝对必须生成无效的 XML,那么您可以将 XML 转换为字符串并执行字符串替换或正则表达式操作以删除不需要的内容。请注意,对 XML 执行字符串操作是一种不好的做法。我强烈建议避免实现这一点并避免生成无效的 XML。
例子:
%dw 1.0
%output application/java
---
// warning: transforming the XML with string operations is not recommended!
write(payload.Envelope.*Header,"application/xml")
这会返回一个 Java 字符串,可以在 DataWeave、Java 代码、MEL 脚本或 Groovy 脚本中进行操作。
关于xml - 骡子 3.9.5 无法将 xml dom 转换为 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72212431/