Xml Talend:设置列对应的属性名称和值

Xml Talend:设置列对应的属性名称和值,xml,csv,talend,Xml,Csv,Talend,我有一个csv作为: ID,Name,Age 1,qwerty,12 2,asdf,11 3,zxcvb,10 我需要创建一个xml,如下所示: <?xml version="1.0" encoding="UTF-8"?> <entities> <entity> <field name="ID" value="1"/> <field name="Name" value="qwerty"/>

我有一个csv作为:

ID,Name,Age
1,qwerty,12
2,asdf,11
3,zxcvb,10
我需要创建一个xml,如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<entities>
    <entity>
        <field name="ID" value="1"/>
        <field name="Name" value="qwerty"/>
        <field name="Age" value="12"/>
    </entity>
        <entity>
        <field name="ID" value="2"/>
        <field name="Name" value="asdf"/>
        <field name="Age" value="11"/>
    </entity>
         <entity>
        <field name="ID" value="3"/>
        <field name="Name" value="zxcvb"/>
        <field name="Age" value="10"/>
    </entity>
</entities>

列名因csv文件而异。因此,我想制作一个通用作业,它接收所有列并生成一个xml,如图所示。任何帮助都将不胜感激

试试这个

/**
*将CSV文件转换为简单的XML文件
*
*@param string$文件
*@param string$container
*@param string$行
*@返回字符串
*/
函数csv2xml($file,$container='data',$rows='row')
{
$r=“\n”;
$row=0;
$cols=0;
$titles=array();
$handle=@fopen($file,'r');
如果(!$handle)返回$handle;
while(($data=fgetcsv($handle,1000,,'))!==FALSE)
{
如果($row>0)$r.=“\t\n”;
如果(!$cols)$cols=计数($data);
对于($i=0;$i<$cols;$i++)
{
如果($row==0)
{
$titles[$i]=$data[$i];
继续;
}
$r.=“\t\t”;
$r.=$data[$i];
$r.=“\n”;
}
如果($row>0)$r.=“\t\n”;
$row++;
}
fclose($handle);
$r=”;
返回$r;
}
$xml=csv2xml('/home/user/myfile.csv','people','person');
?>

在以下位置找到此项:

这是一个XQuery程序,可以执行此操作:

<entities>
{
  let $rows :=
    let $input := "ID,Name,Age
      1,qwerty,12
      2,asdf,11
      3,zxcvb,10"
    return tokenize($input, "&#10;")
  let $columns := tokenize(head($rows), ",")
  for $row in tail($rows)
  let $data := tokenize($row, ",")
  return 
    <entity>
    {
      for $column at $p in $columns
      return
        <field name="{$column}" value="{$data[$p]}"/>
    }
   </entity>
}
</entities>

{
让$rows:=
让$input:=“ID、姓名、年龄
1,qwerty,12
2,asdf,11
3,zxcvb,10“
返回标记化($input,
;)
让$columns:=标记化(头($rows),“,”)
对于尾部的$row($rows)
让$data:=标记化($row,“,”)
返回
{
对于$columns,在$columns中的$p处
返回
}
}
在try.zorba-xquery.com上测试,它输出:

<?xml version="1.0" encoding="UTF-8"?>
<entities>
  <entity>
    <field name="ID" value=" 1"/>
    <field name="Name" value="qwerty"/>
    <field name="Age" value="12"/>
  </entity>
  <entity>
    <field name="ID" value=" 2"/>
    <field name="Name" value="asdf"/>
    <field name="Age" value="11"/>
  </entity>
  <entity>
    <field name="ID" value=" 3"/>
    <field name="Name" value="zxcvb"/>
    <field name="Age" value="10"/>
  </entity>
</entities>

既然您要求使用Talend,那么如果您事先知道列名就很容易了,因为这样您只需要tFileInputDelimited->tFileOutputXML。如果您不知道列名(它们位于数据文件的第一行),则需要使用支持“动态列”的Talend Integration Suite(而不是Talend Open Studio)

将文件的架构定义为Dynamic类型的单个列。该列将包含您的所有数据。但要将其写成XML,您需要手工进行一些Java编码(在tJavaFlex组件中)。这并不难,如果你需要进一步的帮助,我可能会告诉你怎么做


但正如我所说,这在Talend Open Studio版本中不起作用,只在订阅版本中起作用。

感谢您的回复。这不是关于将
csv
转换为
xml
,我特别需要如何使用talend进行转换。抱歉,我一定跳过了这一步。