Конвертировать XML в командную строку оболочки CSV
У меня есть большой XML-файл (600 МБ), и я хочу преобразовать его в CSV с помощью команд терминала. Я попытался преобразовать XML в TXT с помощью команды xml2, используя следующий синтаксис.
xml2
BIG.txt
Мой XML Fromat
<ReportDetails>
<Date>08/08/2012</Date>
<CaseNo>13030903</CaseNo>
<UserDetailsText>Individual Details</UserDetailsText>
<UserDetails>
<UserId>0903</UserId>
<FirstName>John</FirstName>
<Surname>Perry</Surname>
<Occupation>Developer</Occupation>
<DateofBirth>02/14/1981</DateofBirth>
</UserDetails>
<ApplicationDetailsText>Conflict Resolution Details</ApplicationDetailsText>
<ApplicationDetails>
<ApplicationNo>13033</ApplicationNo>
<ApplicationName>John Perry</ApplicationName>
<Department>Information Technology</Department>
<ApplicationType>Personal</ApplicationType>
<ApplicationDate>06/07/2012</ApplicationDate>
<ApplicationEndDate>09/07/2012</ApplicationEndDate>
<ApplicationStatus>Closed</ApplicationStatus>
</ApplicationDetails>
</ReportDetails>
Я хочу, чтобы эти поля в файле CSV были разделены с помощью трубы (|)
Дата | CaseNo | FirstName | Фамилия | ApplicationNo | ApplicationName | ApplicationDate | Статус приложения
Кроме того, если я хочу сделать файл через файл PHP, мне потребуется сценарий оболочки, чтобы выполнить это.
1 ответ
Используйте XSL для преобразования в нужный вам формат; например,
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />
<xsl:template match="/ReportDetails">
<xsl:value-of select="Date"/><xsl:text>|</xsl:text>
<xsl:value-of select="CaseNo"/><xsl:text>|</xsl:text>
<xsl:apply-templates select="UserDetails" />
</xsl:template>
<xsl:template match="/ReportDetails/UserDetails">
<xsl:value-of select="FirstName"/><xsl:text>|</xsl:text>
<xsl:value-of select="Surname"/><xsl:text>|</xsl:text>
</xsl:template>
<!-- etc -->
</xsl:stylesheet>
И затем с учетом вышеизложенного (например, в foo.xsl для преобразования исходного XML-документа foo.xml):
$ xsltproc foo.xsl foo.xml
08/08/2012|13030903|John|Perry|
(Дьявол в деталях XSL... Есть множество способов реализовать это...)