使用Scriptella将XML转换为CSV,如何获取属性值?
我发现了一个将XML转换为CSV的示例,在使用的示例中,这个结构使用Scriptella将XML转换为CSV,如何获取属性值?,xml,csv,scriptella,Xml,Csv,Scriptella,我发现了一个将XML转换为CSV的示例,在使用的示例中,这个结构 <!-- Demo input for ETL --> <CATALOG> <CD> <TITLE>Empire Burlesque</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> &l
<!-- Demo input for ETL -->
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</CATALOG>
<CATALOG>
<CD title='Empire Burlesque' artist='Bob Dylan' country='USA'/>
.............
<CD title='Empire Burlesque' artist='Bob Dylan' country='USA'/>
</CATALOG>
皇帝讽刺剧
鲍勃·迪伦
美国
哥伦比亚
10.90
1985
在此文件结构中,Scriptella代码:
<script connection-id="out">Title;Artist;Country;Company;Price;Year</script>
<query connection-id="in">
<!--XPath which all CD elements in a catalog-->
/CATALOG/CD
<!--Outputs all matched elements-->
<script connection-id="out" if="rownum>1">$TITLE;$ARTIST;$COUNTRY;$COMPANY;$PRICE;$YEAR</script>
</script>
标题;艺术家;国家;公司;价格;年
/目录/CD
$TITLE$艺术家$国家$公司$价格$年
如何转换具有以下结构的XML文件
<!-- Demo input for ETL -->
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</CATALOG>
<CATALOG>
<CD title='Empire Burlesque' artist='Bob Dylan' country='USA'/>
.............
<CD title='Empire Burlesque' artist='Bob Dylan' country='USA'/>
</CATALOG>
.............
如何获取XML中属性的值?首先需要为所有连接正确描述驱动程序。除非使用xpath驱动程序,否则无法使用Scriptella解析XML。更多信息请访问: 现在来看看神奇的部分: -您可以使用java库作为替代方案,但由于这两个驱动程序都是现成的,所以我建议您使用它们 -您希望导入xml->需要xpath驱动程序 -您希望导出csv->需要csv驱动程序 -文本驱动程序也可以用于输出csv数据,但您必须手动处理引号和分隔符 如果您的xml数据位于文件
data.xml
中,并且希望将其导出为文件data.csv
中的csv数据,我建议使用以下scriptella etl脚本:
<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd">
<etl>
<connection id="in" driver="xpath" url="data.xml" />
<connection id="out" driver="csv" url="data.csv">
quote=
separator=;
</connection>
<script connection-id="out">
TITLE,ARTIST,COUNTRY,COMPANY,PRICE,YEAR
</script>
<query connection-id="in">
/CATALOG/CD
<script connection-id="out">
$TITLE,$ARTIST,$COUNTRY,$COMPANY,$PRICE,$YEAR
</script>
</query>
</etl>
引述=
分隔符=;
标题、艺术家、国家、公司、价格、年份
/目录/CD
$TITLE、$ARTIST、$COUNTRY、$COMPANY、$PRICE、$YEAR
请尊重XML源代码中使用的案例。您必须使用$TITLE
,而不能使用$TITLE
或$TITLE
,因为
存在于您的XML源中
此类ETL任务不需要rownum测试。您可以通过名称访问属性,与标记相同。看 在您的情况下,通过xpath/CATALOG/CD将节点设置为CD,您可以通过以下方式访问标记和属性:
$CD -> '' (because CD is an emtpy tag)
$title -> 'Empire Burlesque'
$artist -> 'Bob Dylan'
$country -> 'USA'
此外,您还可以使用函数node.getString()和类似xpath的方法访问当前选定节点之外的其他元素:
${node.getString("../CATALOG")}
使用此函数,您可以按路径访问元素(标记),按括号访问属性,如:
${node.getString("../CATALOG/CD[@title='Empire Burlesque']")}
也可以使用索引选择集合中的元素,而不是属性:
${node.getString("../CATALOG/CD[2]")}
当使用以下变量时,此索引符号有效:
xml file: <A><B>1</B><B>2</B><B>3</B></A>
in scriptella:
/A
${B[2]}
xml文件:123
在scriptella中:
/A
${B[2]}
看,答案建议您可以使用这样的特殊代码:?{node.getString(“./@title”)}
。我没有Scriptella,所以我不能写一个测试答案,但一旦你知道如何将其集成到输出脚本中,欢迎你发布一个自己的快速答案。