将.xml转换为.csv Feed

时间:2014-04-15 15:19:11

标签: xml csv

所以我正在尝试转换.xml数据Feed:

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 %*

我不确定如何修改它。有人可以提供一些建议吗?

2 个答案:

答案 0 :(得分:1)

我不确定频道部分是否重复,但项目部分显然是。要将其转换为理智的CSV结构,您需要知道重复<item>的数量。因为您需要知道必须提供多少列。

无论如何 - 在您的情况下,数据的结构使得键的名称是标记的名称,其内容是值。

我的建议是尝试将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

答案 1 :(得分: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