2016-04-12 27 views
1

Birden çok xml dosyasında okumak için Apache Kafka kullanıyorum. Xml dosyalarını düz bir dosyaya (csv dosyası veya metin dosyası) dönüştürmek istiyorum. Aşağıdaki örnek bir çıkışım var:Xml ayrıştırma Apache Kafka

Sanırım xml'yi dom'a dönüştürmek bir çözüm mü yoksa Jackson-xml veri dönüştürücüsünü kullanıyor mu?

Bunu başarmak için en iyi çözümü herkes yorumlayabilir mi? Teşekkürler!

Giriş 1:

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

Giriş 2:

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

Çıktı:

<?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> 

cevap

1

İyi soru. Bunu yapmanın bir yolu, Seni Kafka Üretici java istemcisi kullanıyorsanız varsayıyoruz java soruyla etiketlenmiş beri 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

Oh ilginç bir çözüm. Her alanı kodlamadan bir dizi xml boyunca nasıl yineleyebilirim? Gerçek dosya gerçekten çok uzun ve çok fazla alan var. – Defcon

+0

Bir düğümün tüm isimlerini almak için xpath kullanmayı deneyeceğim ve bunun üzerine yinelemeliyim. –

0

altına bakmak.

Bu durumda, dönüştürmeyi this gibi bir şey kullanarak Yapımcı uygulamanızda yapabilirsiniz.