如何将 xml 中的编码文档字符转换为文本?
How to transform encoded document characters coming in xml into text?
我有一项服务可以返回一些详细信息以及 PDF 文档。 pdf 文档带有编码字符,如下所示。我正在使用写函数在 JSON 中发送整个 XML。但是当我尝试不使用那些编码的 PDF 部分时,它工作正常。但是当我添加编码部分时,转换失败。我该如何处理?我认为这可能与编码有关。
在 java 中,我能够从如下文档部分制作 PDF 文档
String pdfData = documentNode.getTextContent();
File file = new File("C:/Test");
FileOutputStream fos = new FileOutputStream(file);
fos.write(Base64.decodeBase64(pdfData.getBytes()));
fos.flush();
没有 CDATA 部分,这就是我所期待的。我无法在输出中添加 CDATA 部分
<DRIVEResponse>
<Loan LoanNumber="12345678" DRIVEScore="0" TimeZone="EST" >
</Loan>
</DRIVEResponse>
%dw 2.0
output application/json
---
write(payload, 'application/xml')
输出
"<?xml version='1.0' encoding='UTF-8'?>\n<DRIVEResponse>\n <Loan
LoanNumber=\"12345678\" DRIVEScore=\"0\"
TimeZone=\"EST\"/>\n</DRIVEResponse>"
问题似乎是 XML CDATA 部分格式不正确。请注意 CDATA 开始定界符最后一个括号如何在单独的行中:
<![CDATA
[...
在XML specification中是一个单令牌'<![CDATA['
。
DataWeave 游乐场,将其分开写入会导致该错误。只需同时使用 CDATA 定界符即可解决问题,除非文档的另一部分存在其他问题:
<![CDATA[
...
更新:
阅读评论后,我发现还有其他可能的问题。我的理解是,您正在读取 PDF 文件并将其转换为 Java 中的 base64,然后尝试将其作为 CDATA 添加到 XML 输出中。我在那里看到了一些问题。
首先,如果 PDF 是二进制文件,使用 Java 字符串可能会导致编码问题并损坏文件。您应该改用字节数组 (byte[]
)。
其次,不清楚您是如何添加 CDATA 部分的。根据错误,我假设只是连接字符串。
DataWeave 提供了将二进制数据编码为 base64 和生成 CDATA 部分的功能,以更简单和更安全的方式。
示例:
%dw 2.0
output application/json
import toBase64 from dw::core::Binaries
var binaryPdfData="FILE READ FROM FILESYSTEM" as Binary // this is usually a binary payload read from the File connector. As an example I am converting a string to binary
var base64PdfData=toBase64(binaryPdfData)
var outputTemplate= {
DRIVEResponse: {
Loan @(Number: "12345678", DRIVEScore:"0", TimeZone:"EST"): {
Document @(fileType: "pdf"): base64PdfData as CData
}
}
}
---
write(outputTemplate, "application/xml")
我有一项服务可以返回一些详细信息以及 PDF 文档。 pdf 文档带有编码字符,如下所示。我正在使用写函数在 JSON 中发送整个 XML。但是当我尝试不使用那些编码的 PDF 部分时,它工作正常。但是当我添加编码部分时,转换失败。我该如何处理?我认为这可能与编码有关。
在 java 中,我能够从如下文档部分制作 PDF 文档
String pdfData = documentNode.getTextContent();
File file = new File("C:/Test");
FileOutputStream fos = new FileOutputStream(file);
fos.write(Base64.decodeBase64(pdfData.getBytes()));
fos.flush();
没有 CDATA 部分,这就是我所期待的。我无法在输出中添加 CDATA 部分
<DRIVEResponse>
<Loan LoanNumber="12345678" DRIVEScore="0" TimeZone="EST" >
</Loan>
</DRIVEResponse>
%dw 2.0
output application/json
---
write(payload, 'application/xml')
输出
"<?xml version='1.0' encoding='UTF-8'?>\n<DRIVEResponse>\n <Loan
LoanNumber=\"12345678\" DRIVEScore=\"0\"
TimeZone=\"EST\"/>\n</DRIVEResponse>"
问题似乎是 XML CDATA 部分格式不正确。请注意 CDATA 开始定界符最后一个括号如何在单独的行中:
<![CDATA
[...
在XML specification中是一个单令牌'<![CDATA['
。
DataWeave 游乐场,将其分开写入会导致该错误。只需同时使用 CDATA 定界符即可解决问题,除非文档的另一部分存在其他问题:
<![CDATA[
...
更新: 阅读评论后,我发现还有其他可能的问题。我的理解是,您正在读取 PDF 文件并将其转换为 Java 中的 base64,然后尝试将其作为 CDATA 添加到 XML 输出中。我在那里看到了一些问题。
首先,如果 PDF 是二进制文件,使用 Java 字符串可能会导致编码问题并损坏文件。您应该改用字节数组 (byte[]
)。
其次,不清楚您是如何添加 CDATA 部分的。根据错误,我假设只是连接字符串。
DataWeave 提供了将二进制数据编码为 base64 和生成 CDATA 部分的功能,以更简单和更安全的方式。
示例:
%dw 2.0
output application/json
import toBase64 from dw::core::Binaries
var binaryPdfData="FILE READ FROM FILESYSTEM" as Binary // this is usually a binary payload read from the File connector. As an example I am converting a string to binary
var base64PdfData=toBase64(binaryPdfData)
var outputTemplate= {
DRIVEResponse: {
Loan @(Number: "12345678", DRIVEScore:"0", TimeZone:"EST"): {
Document @(fileType: "pdf"): base64PdfData as CData
}
}
}
---
write(outputTemplate, "application/xml")