2016-04-12 95 views
1

我正在使用Apache Kafka读取多个xml文件。我想将xml文件转换为平面文件(csv文件或文本文件)。我有一个输出如下:Xml解析Apache Kafka

我认为将xml转换为dom是一种解决方案或使用Jackson-xml数据转换器?

任何人都可以评论最好的解决方案来实现这一目标吗?谢谢!

输入1:

<?xml version="1.0" encoding="UTF-8"?> 
<customer> 
    <id>123</id> 
    <firstName>Jane</firstName> 
    <phoneNumbers type="work">555-1111</phoneNumbers> 
</customer> 

输入2:

<?xml version="1.0" encoding="UTF-8"?> 
    <customer> 
     <id>1234</id> 
     <firstName>Bob</firstName> 
     <phoneNumbers type="work">555-1111</phoneNumbers> 
    </customer> 

输出:

<?xml version="1.0" encoding="UTF-8"?><customer><id>123</id><firstName>Jane</firstName><phoneNumbers type="work">555-1234</phoneNumbers></customer> 

<?xml version="1.0" encoding="UTF-8"?><customer><id>1234</id><firstName>Bob</firstName><phoneNumbers type="work">555-1111</phoneNumbers></customer> 

回答

1

好问题。做到这一点的方法之一是bash的...看看下面

#!/bin/bash 

>combined.csv 
for xml in *.xml 
do 
    echo "Processing $xml"; 
    id=$({ xmllint --xpath "string(//customer/id)" $xml; echo ","; } | tr "\n" " "); 
    firstname=$({ xmllint --xpath "string(//customer/firstName)" $xml; echo ","; } | tr "\n" " "); 
    phonenumber=$(xmllint --xpath "string(//customer/phoneNumbers)" $xml); 
    line="${id}${firstname}${phonenumber}\n" 
    printf "$line" >> combined.csv 
done 
+0

哦有趣的解决方案。如何在不对每个字段进行硬编码的情况下遍历整个系列的xml?真正的文件非常长,并且有很多字段。 – Defcon

+0

我会尝试使用xpath来获取一个节点的所有名称,并对其进行迭代。 –

0

既然你java标记你的问题,我会假设你使用卡夫卡生产者Java客户端。

如果是这种情况,那么你可以使用像this之类的东西在你的Producer实现中进行转换。