使用Scriptella将XML转换为CSV,如何获取属性值?

时间:2016-02-22 10:08:44

标签: xml csv scriptella

我找到了将XML转换为CSV的示例,在使用的示例中,此结构

<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>

在这个文件结构中,Scriptella代码:

<CATALOG>
    <CD title='Empire Burlesque' artist='Bob Dylan'  country='USA'/>
    .............
    <CD title='Empire Burlesque' artist='Bob Dylan'  country='USA'/>
</CATALOG>

如何转换具有以下结构的XML文件

{{1}}

如何获取XML中的属性值?

3 个答案:

答案 0 :(得分:0)

首先需要为所有连接正确描述驱动程序。除非使用xpath驱动程序,否则无法使用Scriptella解析XML。更多信息:http://scriptella.org/reference/drivers.html

现在为神奇的位: - 您可以使用Java库作为替代可能性,但由于这两个驱动程序是开箱即用的,我建议使用它们 - 你想导入xml - &gt;需要xpath驱动程序 - 你想导出csv - &gt;需要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>

请尊重XML源中使用的案例。您必须使用$TITLE而非$title$Title,因为您的XML来源中存在<TITLE>

此类ETL任务不需要rownum测试。

答案 1 :(得分:0)

您可以按名称访问属性,与标记相同。看here

在您的情况下,通过xpath / CATALOG / CD将节点设置为CD,您可以通过以下方式访问Tag和属性:

$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]")} 

在使用类似in的变量时,此索引符号有效:

xml file: <A><B>1</B><B>2</B><B>3</B></A>
in scriptella:
/A
${B[2]}

答案 2 :(得分:0)

<CATALOG>
    <CD title='Empire Burlesque' artist='Bob Dylan'  country='USA'/>
    .............
    <CD title='Empire Burlesque' artist='Bob Dylan'  country='USA'/>
</CATALOG>

通过以下示例,您可以获取XML中的属性值:

/CATALOG/CD[1]/@title