如何使用perl中基于事件的解析器为庞大的数据构建一个xml树?

时间:2011-05-19 10:51:37

标签: xml perl

我有一个像这样的XML文件:

    <Nodes><Node>
 <NodeName>Company</NodeName>
 <File>employee_details.csv</File>
 <data>employee_data.txt</data>
<Node>
     <NodeName>dummy</NodeName>
     <File>employee_details1.csv</File>
     <data>employee_data1.txt</data>
    </Node>
    </Node>
</Nodes>

    #Contents of employee_data.txt
Empname,Empcode,EmpSal:Currency,Empaddr
#Contents of employee_details.csv (like this huge data)
Alex,A001,1000:USD,Bangalore
Aparna,B001,1000:RUBEL,Bombay
#Contents of employee_data1.txt
phone,fax
#Contents of employee_details1.csv (like this huge data)
44568889,123345656
23232323,454545757

输出:

<Company>
<Empname>Alex</Empname>
<Empcode>A001</Empcode>
<EmpSal=USD>1000</EmpSal>
<Empaddr>Bangalore</Empaddr>
<phone>44568889</phone>
<fax>123345656</fax>
</Company>
<Company>
<Empname>Aparna</Empname>
<Empcode>B001</Empcode>
<EmpSal=RUBEL>1000</EmpSal>
<Empaddr>Bombay</Empaddr>
<phone>23232323</phone>
<fax>454545757</fax>

我想用Sax解析器构建一个XML树,但我无法理解如何遍历所有节点并创建事件。

我应该得到上面的输出?

如何在Perl中完成?

3 个答案:

答案 0 :(得分:2)

.pl文件 my $ factory = XML :: SAX :: ParserFactory-&gt; new(); 我的$ parser = $ factory-&gt;解析器(Handler =&gt; sax_handler-&gt; new(arguments_to parse));

sax_handler.pm su new() { //没有这样的!    我的($ type);    return bless {},$ type; } //关注2种方法很重要 sub start_element {     我的($ self,$ element)= @_;

#attributes of comment tag...m:text is tag
if( $element->{Name} eq "m:text")
{
$name=$element->{Attributes}->{'{}name'}->{'Value'};
}

}

// m:reviewID是u r xml中的标签! sub end_element {     我的($ self,$ element)= @_;

#write down all tags...& print them or manipulate them
if( $element->{Name} eq "m:reviewID"){

} }

答案 1 :(得分:1)

在我看来,CSV文件可能很大,而不是XML文件。所以真的没有必要使用SAX解析器。 XML仅用于为您提供4个文件的位置。其中2个文件(.txt个)很小,它们只包含一个字段列表,最后两个文件可能很大。这些是CSV文件。

您应该使用Text::CSV_XS来解析这两个巨大的文件。然后,您可以使用普通打印输出XML(只需确保转义文本并注意编码(示例输出中的BTW <EmpSal=USD>不是格式良好的XML,需要引用属性值:{ {1}})。其他选项是XML::Writer,它将为您处理转义和引用。我不认为生成SAX事件并将它们传递给SAX编写器在这种情况下是有意义的,它会比其他选项更复杂,可能更慢。

答案 2 :(得分:1)

SAX Parser与其他解析技术略有不同。在这里你需要编写你的处理程序[perl模块]。模块必须包含以下内容 - &gt;构造函数。 2.子程序start_element 3.end_element。您可以管理子程序中的事件,例如[for tag] - &gt; if($ element-&gt; {Name} eq“mail_id”){         $ user_mail_id = $自&GT; get_text();}