我正在尝试采用一些XML代码,一个示例如下:
<time_report>
<project_ID>4</project_ID>
<project_status>close</project_status>
<client_ID>6001</client_ID>
<time_record>
<project_start_time>15:02:33</project_start_time>
<project_end_time>15:07:44</project_end_time>
<project_total_time>PT00H05M11S</project_total_time>
</time_record>
<employee_ID>10001</employee_ID>
<employee_name>Mary Beth</employee_name>
<date_created>2009-08-25</date_created>
</time_report>
,然后输出以下格式:
project_id, project_status, client_id, project_start_time, project_end_time, project_total_time, employee_ID, employee_name, date_created
4, close, 6001, 15:02:33, 15:07:44, PT00H05M11S, 10001, Mary Beth, 2009-08-25
我一直在尝试使用Xmllint来做到这一点,但不幸的是,我想知道我是否会建议我该怎么办?我会在狂欢/壳环境中这样做。任何帮助将不胜感激,谢谢!
还忘了提到,如果我在Excel中打开XML文件,然后将其保存为CSV,我可以获得正确的结果,只是在Linux
中寻找一种方法 project_ID,project_status,client_ID,project_start_time,project_end_time,project_total_time,employee_ID,employee_name,date_created
4,close,6001,15:02:33,15:07:44,PT00H05M11S,10001,Mary Beth,8/25/2009
5,open,6003,12:00:00,12:45:00,PT00H45M00S,10003,Michelle,9/11/2009
2,close,6002,10:00:00,10:30:00,PT00H30M00S,10002,Joe,8/25/2009
2,open,6004,12:00:00,3:27:05,PT03H23M05S,10004,Mike,8/13/2009
xmlstarlet是一个非常强大的命令行工具,可让您查询XML或运行XSLT转换。有一些XSLT XML-> CSV示例浮动,但以下单线为您提供了您的需求:
xmlstarlet sel -B -t -m "//time_reports/time_report" -n -m "*" -v . -o , input.xml
唯一的问题是我需要用名为 <time_reports>
<time_report>
将您的XML转换为CSV(例如XSLTProc)您可以使用XSL样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:for-each select="//time_report[position()=1]/*">
<xsl:if test="not(position()=1)">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:value-of select="name()" />
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:for-each select="//time_report">
<xsl:for-each select="./*">
<xsl:if test="not(position()=1)">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(.)" />
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
您也可以使用我的Xidel :(假设您的XML中没有空字段)
xidel /tmp/test.xml -e '//time_report/string-join(.//text()[normalize-space(.)], ", ")'
标准XPath 2,无需记住不同命令行参数的名称...
或没有该假设:
xidel /tmp/test.xml -e '//time_report/string-join(.//*[not(*)], ", ")'