使用Scriptella将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

我发现了一个将XML转换为CSV的示例,在使用的示例中,这个结构

<!-- 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,所以我不能写一个测试答案,但一旦你知道如何将其集成到输出脚本中,欢迎你发布一个自己的快速答案。