4

我找到了一个将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 中的属性值?

4

3 回答 3

0

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

现在是魔术位:-您可以使用 java 库作为替代可能性,但是由于这两个驱动程序是开箱即用的,我建议使用它们-您希望导入 xml-> 需要 xpath 驱动程序-您希望导出csv -> 需要 csv 驱动程序 - 文本驱动程序也可用于输出 csv 数据,但您必须手动处理引用和分隔符

如果您的 xml 数据在文件中data.xml,并且您希望将其导出为文件中的 csv 数据data.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 源代码中使用的大小写。您必须使用$TITLEand not $titlenor $Title,因为<TITLE>它存在于您的 XML 源代码中。

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

于 2016-09-02T10:54:21.543 回答
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
于 2020-05-18T08:53:12.023 回答
0

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

在您的情况下,通过 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]}
于 2020-04-24T10:24:48.347 回答