有一个文件(压缩)有效地包含多个相同格式的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问题
答案 0 :(得分:0)
我建议您将multi-xml文件拆分为单个xml文件,然后使用tFileInputXML
读取每个单独的文件。以下是我为实现这一目标所做的工作:
首先使用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文件。
这里我只打印文件路径到控制台。
替代解决方案
这是文件拆分部分的更有效实现。它使用tFileInputFullRow
逐行读取文件(\n
分隔符),然后将每一行写入文件(注意tFileOutputDelimited_1
中的追加模式)。如果刚刚写入的行是xml结束标记,请增加文件编号,以便将下一行写入不同的文件,否则保留相同的文件编号。