如何使用 Perl 中基于事件的解析器为海量数据构建 xml 树?

发布于 2024-11-08 13:28:39 字数 1377 浏览 0 评论 0 原文

我有一个像这样的 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 做到这一点?

I have an XML file like this:

    <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

Output:

<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>

I want to build an XML tree with Sax parser but I am not able to understand how to traverse across all the nodes and create an event.

I should get the above output?

How can I do it in Perl?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

も让我眼熟你 2024-11-15 13:28:39

.pl 文件
我的 $factory = XML::SAX::ParserFactory->new();
我的 $parser = $factory->parser( Handler =>sax_handler->new(arguments_to parse));

sax_handler.pm
苏新()
{
//什么都不是!
我的($类型);
返回祝福{},$类型;
}
//以下2个方法很重要
子起始元素
{
我的($self,$element)=@_;

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

}

//m:reviewID 是 xml 中的标签!
子结束元素
{
我的($self,$element)=@_;

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

}
}

.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) = @_;

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

}

//m:reviewID is tag in u r xml !
sub end_element
{
my ($self, $element) = @_;

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

}
}

稚然 2024-11-15 13:28:39

在我看来,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.

并安 2024-11-15 13:28:39

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();}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文