我有一个像这样的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中完成?
答案 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();}