【问题标题】:Convert XML to CSV with Scriptella, how to get attribute values?使用 Scriptella 将 XML 转换为 CSV,如何获取属性值?
【发布时间】:2016-06-03 17:06:40
【问题描述】:

我找到了一个将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>

在这个文件结构中,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>

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

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

如何获取 XML 中的属性值?

【问题讨论】:

  • over here,答案建议您可以使用特殊的node variable,如下所示:?{node.getString("./@title")}。我没有 Scriptella,所以我无法编写经过测试的答案,但欢迎您在弄清楚如何将其准确地集成到输出脚本中后发布您自己的快速答案。

标签: xml csv scriptella


【解决方案1】:

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

现在是魔术位: - 您可以使用 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>

请尊重 XML 源代码中使用的大小写。您必须使用$TITLE 而不是$title$Title,因为&lt;TITLE&gt; 存在于您的XML 源中。

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

【讨论】:

    【解决方案2】:

    您可以按名称访问属性,就像标签一样。看here

    在您的情况下,通过 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")} 
    

    使用此函数,您可以通过路径访问元素(标签)并通过括号-at 表示法访问属性,例如:

    ${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]}
    

    【讨论】:

      【解决方案3】:
      <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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 2022-01-09
        相关资源
        最近更新 更多