2014-04-15 173 views
1

所以我想爲.xml數據原料轉化:.XML轉換爲.csv飼料

enter image description here

到.csv格式,但這種格式

http://www.shoptab.net/blog/wp-content/uploads/2009/12/step4_datafeed.jpg

我有重複的元素,如「標題」,「描述」等,我想從完全垂直的XML格式,並將每個元素分解成一個單獨的列。

我發現一個tool,我相信正是這樣做的,但我不知道如何設置它

我有兩個文件 - 一個.BAT和.jar。在將.bat,我們有以下默認代碼:

java -jar xml2csv-conv.jar %*

我不知道我該怎麼去修改這個。有誰能提供一些建議嗎?

+1

什麼是運行在你的輸入文件的批處理文件的結果呢? –

+0

恰恰是這個問題。我覺得自己像個傻瓜,因爲我無法讓它運行我的文件(名爲feed1.xml)。 – user3536576

+0

你的鏈接上的文檔說使用'xml2csv-conv feed1.xml feed1.csv' - 這是行不通的嗎? –

回答

1

我不確定頻道部分是否重複,但項目部分顯然是。要將其變成一個理想的CSV結構,您需要知道重複的<item> s的數量。因爲你需要知道你需要提供多少列。

無論如何 - 數據在您的案例中以這樣的方式構建:密鑰的名稱是標籤的名稱,其內容是值。

我的建議是嘗試將XPath來你的情況是這樣的:

<root> 
    <record id="1"> 
    <keyA>val_1A</keyA> 
    <keyB>val_1B</keyB> 
    </record> 
    <record id="2"> 
    <keyA>val_2A</keyA> 
    <keyB>val_2B</keyB> 
    </record> 
    <record id="3"> 
    <keyA>val_3A</keyA> 
    <keyB>val_3B</keyB> 
    </record> 
</root> 

隨着xmlstarlet你可以解析這個XML文檔(的test.xml):

xmlstarlet \ 
    sel -T -t -m /root/record \ 
     -v "concat(@id,';',keyA,';',keyB)" \ 
     -n test.xml 

1;val_1A;val_1B 
2;val_2A;val_2B 
3;val_3A;val_3B 

您可以進一步找到以下教程中的示例和更多解釋:

Transforming an XML Document into a CSV using XMLStarlet

0

您可以編寫非常簡單的Python腳本,該腳本使用lxml讀取XML,並使用Python標準庫中的csv模塊編寫CSV。

xml_to_csv.py

import argparse 
import csv 
from lxml import etree 
import sys 

def main(): 
    p = argparse.ArgumentParser() 
    p.add_argument('xml_file') 
    args = p.parse_args() 
    xml_str = open(args.xml_file, 'rb').read() 
    root = etree.XML(xml_str) 
    w = csv.DictWriter(
     sys.stdout, 
     fieldnames=''' 
      title description link 
     '''.split()) 
    w.writeheader() 
    for item in root.findall('./channel/item'): 
     row = { 
      'title': item.find('./title').text, 
      'description': item.find('./description').text, 
      'link': item.find('./link').text, 
     } 
     w.writerow(row) 

if __name__ == '__main__': 
    main() 

feed.xml

<?xml version="1.0" encoding="iso-8859-1" ?> 
<rss version="0.91"> 
    <channel> 
     <title>Delphi Programming</title> 
     <item> 
      <title>How to draw rotated text</title> 
      <link>http://delphi.about.com/1234.html</link> 
      <description>This example creates...</description> 
     </item> 
     <item> 
      <title>FutureValue function</title> 
      <link>http://delphi.about.com/5678.html</link> 
      <description>Returns the future...</description> 
     </item> 
    </channel> 
</rss> 

用法:

$ pip install lxml # if needed 
$ python3 xml_to_csv.py feed.xml 
title,description,link 
How to draw rotated text,This example creates...,http://delphi.about.com/1234.html 
FutureValue function,Returns the future...,http://delphi.about.com/5678.html