如何使用 Perl 中基于事件的解析器为海量数据构建 xml 树?
我有一个像这样的 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 做到这一点?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
.pl 文件
我的 $factory = XML::SAX::ParserFactory->new();
我的 $parser = $factory->parser( Handler =>sax_handler->new(arguments_to parse));
sax_handler.pm
苏新()
{
//什么都不是!
我的($类型);
返回祝福{},$类型;
}
//以下2个方法很重要
子起始元素
{
我的($self,$element)=@_;
}
//m:reviewID 是 xml 中的标签!
子结束元素
{
我的($self,$element)=@_;
}
}
.pl file
my $factory = XML::SAX::ParserFactory->new();
my $parser = $factory->parser( Handler =>sax_handler->new(arguments_to parse));
sax_handler.pm
su new()
{
//nothing as such !
my ($type);
return bless {}, $type;
}
//follwong 2 methods are important
sub start_element
{
my ($self, $element) = @_;
}
//m:reviewID is tag in u r xml !
sub end_element
{
my ($self, $element) = @_;
}
}
在我看来,CSV 文件可能很大,而不是 XML 文件。所以实际上没有必要使用 SAX 解析器。 XML 仅用于提供 4 个文件的位置。其中 2 个文件(
.txt
文件)很小,仅包含字段列表,最后 2 个文件可能很大。这些是 CSV 文件。您应该使用 Text::CSV_XS 来解析这两个大文件。然后,您可以使用纯打印输出 XML(只需确保转义文本并注意编码(顺便说一句,示例输出中的
不是格式良好的 XML,属性值需要加引号:
)。 ” rel="nofollow">XML::Writer,它将为您处理转义和引用,我认为在这种情况下生成 SAX 事件并将它们传递给 SAX 编写器没有意义。比其他选项更复杂并且可能更慢。It looks to me that the CSV files can be huge, not the XML one. So really there is no need to use a SAX parser. The XML is used only to give you the location of 4 files. 2 of those files (the
.txt
ones) are small, they only contain a list of fields, and the last 2 files can be big. Those are the CSV file.You should use Text::CSV_XS to parse those 2 huge file. You can then output the XML using plain print (just make sure you escape the text and pay attention to the encoding (BTW in your sample output
<EmpSal=USD>
is not well-formed XML, the attribute value needs to be quoted:<EmpSal="USD">
). An other options is XML::Writer, which will take care of escaping and quoting for you. I don't think generating SAX events and passing them to a SAX writer makes sense in this case, it would be more complex and probably slower than the other options.SAX 解析器与其他解析技术略有不同。在这里你需要编写你的处理程序[perl模块]。模块必须包含以下内容 -> 1.构造函数。 2. 子程序start_element 3.end_element。您可以像这样管理子例程内的事件 [for tag] -->if( $element->{Name} eq "mail_id"){
$user_mail_id=$self->get_text();}
Well SAX Parser is slightly different from other parsing techniques. Here you need to write your handler [ perl module]. module must contains following things -> 1. constructor. 2. subroutine start_element 3.end_element. You can manage events inside the subroutines like this [for tag] -->if( $element->{Name} eq "mail_id"){
$user_mail_id=$self->get_text();}