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

时间:2018-04-04 15:30:46

标签: xml etl 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问题

1 个答案:

答案 0 :(得分:0)

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

enter image description here

首先使用tFileInputDelimited读取包含单个列(内容)的文件,将行分隔符设置为&#34; </Proposal>&#34;。这将使用单个xml文件的内容填充内容列(没有结束标记,因为它被设置为行分隔符)。
然后迭代每一行,并使用具有2列的tFixedFlowInput读取它:xmlFile(设置为content)和closingTag,其中包含已由tFileInputDelimited删除的结束标记。然后将其发送到tFileOutputDelimited,它将xml内容和结束标记写在它旁边(注意空字段分隔符)。
文件名是动态的,因此您有编号的文件。 NB_FILE中的tSetGlobalVar_1全局变量首先设置为1,然后在tSetGlobalVar_2中的每个生成文件上递增。 最后,您可以简单地使用带有掩码的tFileList,例如&#34; out _ *。xml&#34;为了迭代并使用tFileInputXML读取生成的xml文件。

enter image description here

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

替代解决方案

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

enter image description here

相关问题