所以我正在尝试转换.xml数据Feed:
转换为.csv但格式为
我有重复的元素,如“标题”“描述”等,我想从完全垂直的xml格式中取出它们,并将每个元素分解为一个单独的列。
我发现了一个tool我认为确实如此,但我无法理解如何设置
我有两个文件 - .bat和.jar。在.bat中,我们有以下默认代码:
java -jar xml2csv-conv.jar %*
我不确定如何修改它。有人可以提供一些建议吗?
答案 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
您可以在以下教程中找到更多示例和更多解释:
答案 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