在 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 结束标记,则递增文件号以便将下一行写入不同的文件,否则保持相同的文件号。
有一个文件(压缩)实际上包含多个相同格式的 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 结束标记,则递增文件号以便将下一行写入不同的文件,否则保持相同的文件号。