perlxml到CSV解析

perlxml到CSV解析,xml,perl,parsing,csv,Xml,Perl,Parsing,Csv,我一直在想如何将xml数据源解析成CSV文件,这让我有点疯狂。我有一个数据源,我需要解析一个创建一个CSV。我还需要能够将节点ID包含为列。以下是我所拥有的: #!/usr/bin/perl use warnings; use strict; use XML::XPath; #Name of the CSV File my $filename = "parse.csv";

我一直在想如何将xml数据源解析成CSV文件,这让我有点疯狂。我有一个数据源,我需要解析一个创建一个CSV。我还需要能够将节点ID包含为列。以下是我所拥有的:

         #!/usr/bin/perl
            use warnings;
        use strict;
        use XML::XPath;

        #Name of the CSV File
        my $filename = "parse.csv";

        #Create the file.
        open(INPUT,">$filename") or die "Cannot create file";

        #Collect the XML and set nodes
        my($xp) = XML::XPath->new( join('', <DATA>) );
        my(@records) = $xp->findnodes( '/CATALOG/CD' );
        my($firstTime) = 0;

        #Loop through each record
        foreach my $record ( @records ) {
            my(@fields) = $xp->find( './child::*', $record )->get_nodelist();
            unless ( $firstTime++ ) {
            #Print Headers
                print( join( ',', map { $_->getName() } @fields ), "\n");
            }
            #Print Content
                print( join( ',', map { $_->string_value() } @fields ), "\n");
        }
        #Close the file.
        close(INPUT);


        __DATA__
        <FOOD>
            <ITEM id='1'>
                <Color>Brown</Color>
                <Name>Steak</Name>
            </ITEM>
            <ITEM id='2'>
                <Color>Blue</Color>
                <Name>Blueberries</Name>
            </ITEM>
            <ITEM id='3'>
                <Color>Red</Color>
                <Name>Apple</Name>
            </ITEM>
        </FOOD>
它创建了一个CSV,但是它是空的&我认为这是因为foreach循环中的打印行


任何帮助都将不胜感激

您正在将标题和内容打印到标准输出,而不是打印到输出文件。您需要将文件句柄作为要打印的第一个参数传递,并且文件句柄和要打印的内容之间不带逗号。类似于:打印文件连接“,”,…,\n


我还建议不要将输入作为输出到的文件句柄使用-这会使理解代码有点混乱。

您正在将标题和内容打印到标准输出,而不是打印到输出文件。您需要将文件句柄作为要打印的第一个参数传递,并且文件句柄和要打印的内容之间不带逗号。类似于:打印文件连接“,”,…,\n

我还建议不要使用输入作为输出到的文件句柄-这会使理解代码有点混乱

鉴于XML模式的简单性,这更容易处理

例如:

!/usr/bin/perl 此脚本将XML文件转换为CSV格式。 将AnyData XML加载到CSV转换模块 使用XML::解析器; 使用XML::Twig; 使用任何数据; my$input_xml=test.xml; my$output_csv=test.csv; $flags->{record_tag}='ITEM'; adConvert'XML',$input_XML','CSV',$output_CSV,$flags; 将数据结构XML转换为:

id、颜色、名称 1、棕色、牛排 2、蓝色、蓝莓 3、红色、苹果色 鉴于XML模式的简单性,这更容易处理

例如:

!/usr/bin/perl 此脚本将XML文件转换为CSV格式。 将AnyData XML加载到CSV转换模块 使用XML::解析器; 使用XML::Twig; 使用任何数据; my$input_xml=test.xml; my$output_csv=test.csv; $flags->{record_tag}='ITEM'; adConvert'XML',$input_XML','CSV',$output_CSV,$flags; 将数据结构XML转换为:

id、颜色、名称 1、棕色、牛排 2、蓝色、蓝莓 3、红色、苹果色
在您的情况下,您使用的是/CATALOG/CD,而不是数据。请使用类似

my(@records) = $xp->findnodes( '/FOOD/ITEM' );
....
...
...
print INPUT ( join( ',', map { $_->getName() } @fields ), "\n" );

在您的情况下,您使用的是/CATALOG/CD,而不是数据。请使用类似

my(@records) = $xp->findnodes( '/FOOD/ITEM' );
....
...
...
print INPUT ( join( ',', map { $_->getName() } @fields ), "\n" );

作为一种风格,如果可以避免的话,不要将文件名硬编码到脚本中。使它们成为可选参数、从标准输出读取输入或执行等效操作以及将输出写入标准输出,使脚本更易于重用、组合和测试。作为一种风格,如果可以避免,请不要将文件名硬编码到脚本中。使它们成为可选参数,从标准输出读取输入或执行等效操作,并将输出写入标准输出,这些都使脚本更易于重用、组合和测试。