我必须使用单个参数(XML 格式的字符串)调用 Web 服务。 我通过 XSLT 转换来构建它。到目前为止,一切都很好。
问题出在这个 XSD 片段上:
<xs:complexType name="Document">
<xs:sequence>
<xs:element name="title" type="xs:string" minOccurs="1"/>
<xs:element name="content" type="xs:base64Binary" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
(例如)转换为以下 XML:
<attachment>
<title>test title</title>
<content>
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Inllc
yI/Pg0KPG1zZ3ByYXRpY2E+DQogICAgPHByYXRpY2E+DQogICAgICAgIDxwcm9jZXNzbz
4NCiAgICAgICAgICAgIDxjb2RQcm9jZXNzbz4xPC9jb2RQcm9jZXNzbz4NCiAgICAgICA
gICAgIDxjb2RJc3RhbnphUHJvY2Vzc28MzwvY29kSXN0YW56YVByb2Nlc3NvPg0KICAgI
CAgICAgICAgPGNvZFN0YXRvPjYwPC9jb2RTdGF0bz4NCiAgICAgICAgPC9wcm9jZXNzbz
4NCiAgICA8L3ByYXRpY2E+DQo8L21zZ3ByYXRpY2E+
</content>
</attachment>
是的,你没看错:我必须将文件内容以 Base 64 二进制格式插入到 XML 文档中。
我考虑过使用 XSLT 插入占位符,然后处理 XML 文档以将其替换为实际的文件内容,但我想知道这些情况是否有任何最佳实践,也许是一些超出我知识范围的奇特 XSTL 技巧或者一些可能会派上用场的 Java 工具。
你会怎么做?
注意:我不能使用带有附件的 SOAP,并且我很清楚上述方法在附件很大的情况下很容易失败,但是在当我们的对手不肯让步的那一刻。
最佳答案
执行此操作的最佳方法可能是读取文件并通过实例化 XSLT 转换的代码以 Base64 对其内容进行编码。 Base64 字符串可以作为参数传递给转换,或者转换可以通过扩展方法请求它。
原则上,XSLT 可用于对 base64 进行编码,但是某些字节值,例如 0(对于 XML 1.0 和 XML 1.1),以及低于 0x20 的 29 个其他代码(对于 XML 1.0) ) 被禁止作为 XML 文档中的字符,这使得 XSLT 中的此类编码变得不可能。
(参见:http://projects.ischool.washington.edu/tabrooks/545/ContentManagement/PassingParameters.htm)
关于java - Web 服务的 XML : inline attachment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/707237/