在 Talend 中将包含多个 XML 行代码块的单个文件读入多个 xml 文件

Read a single file containing multiple XML line code blocks into multiple xml files in Talend

有一个文件(压缩)实际上包含多个相同格式的 XML 个文件,因此文件本身不是有效的 XML;例如: 大文件内容如下

<?xml version='1.0' encoding='UTF-8'?>
<Proposal xmlns="a namespace">
    <ASubnode>Text</ASubNode>
    <LotsOfOtherNodes />
</Proposal>
<?xml version='1.0' encoding='UTF-8'?>
<Proposal xmlns="a namespace">
    <ASubnode>Text</ASubNode>
    <LotsOfOtherNodes />
</Proposal>
....

我想处理所有节点,一次处理一个节点 XML; 例如:

<Proposal xmlns="a namespace">
    <ASubnode>Text</ASubNode>
    <LotsOfOtherNodes />
</Proposal>

上面的块应该被 Talend 等读取为第一个 XML 文件..

我不能使用 tFileInputXML,因为它在到达中间 XML 声明节点时抛出异常。您能否提出解决此问题的方法?

注意:我在 Java

上使用了一个类似 Stack Overflow 问题的示例

我建议您将 multi-xml 文件拆分为单独的 xml 个文件,然后使用 tFileInputXML 阅读每个单独的文件。这是我为实现这一目标所做的工作:

首先读取具有单列(内容)的 tFileInputDelimited 文件,将行分隔符设置为“</Proposal>”。这将使用单个 xml 文件的内容填充内容列(没有结束标记,因为它被设置为行分隔符)。
然后遍历每一行,并使用具有 2 列的 tFixedFlowInput 读取它:xmlFile(设置为内容)和包含已被 tFileInputDelimited 删除的结束标记的 closingTag。然后将其发送到 tFileOutputDelimited,它在其旁边写入 xml 内容和结束标记(注意空字段分隔符)。
文件名是动态的,因此您可以对文件进行编号。 NB_FILE 全局变量首先在 tSetGlobalVar_1 中设置为 1,然后在 tSetGlobalVar_2 中对每个生成的文件递增。
最后,您可以简单地使用 tFileList 和 "out_*.xml" 之类的掩码,以便迭代并使用 tFileInputXML.[=27= 读取生成的 xml 文件]

这里我只是将文件路径打印到控制台。

备选方案

这里有一个更高效的文件拆分部分的实现。它使用 tFileInputFullRow 逐行读取文件(\n 分隔符),然后将每一行写入文件(注意 tFileOutputDelimited_1 中的追加模式)。如果刚刚写入的行是 xml 结束标记,则递增文件号以便将下一行写入不同的文件,否则保持相同的文件号。