用perl处理含特殊编码的xml文件
2010-08-30 15:42
411 查看
perl对文本具有强大的处理能力。对于xml的处理,perl自带有XML::DOM 和 XML::Simple两个模块用来处理XML。
XML::DOM过于庞大,而且解析结果是一个DOM树,操作也不方便。我们更多的是处理小型简单的XML文件,所以更多的是采用XML::Simple。
但不管是DOM还是Simple,当涉及到gb2312和GBK编码的时候,虽然对perl用encodeing = "GB2312 " 指定编码,但由于一些火星文,
还是常常解析出错。而且用这两个模块处理的时候,一旦出错,就导致整个文件不能解析。
对于特定的场合,完全可以用perl的正则匹配语法,来处理xml文件。
比如下面的文本
<m>
<c> 今日特价 【QQ商城千件秒杀】百事运动 防震缓冲慢跑男鞋 翼神 </c>
<i>0</i>
<y>0</y>
<t>20100605065101</t>
<k>250470602</k>
</m>
<m>
<c>我想今天买这双鞋</c>
<i>0</i>
<y>0</y>
<t>20100605065125</t>
<k>250470602</k>
</m>
首先,通过下面函数,将每一个消息隔开。注意其中消息可能换行的处理。
sub processmessages
{
my $processmessages = $_[0];
if($processmessages =~ /<message>(.*)<//message>/)
{
my $msgcont = $1;
while( $msgcont =~ /<m>(.*?)<//m>(.*)/ )
{
my $onemesg = $1;
#print "#########################/n";
&processonemsg($onemesg);
#print "/n########################/n";
}
}
}
然后对每条消息进行处理
sub processonemsg
{
my $mesg = $1;
if ($mesg =~ /<c>(.*)<i>(.*)<y>(.*)<//y><t>(.*)<//t><k>(.*)<//k>/)
{
print ResultFile $caseid;
print ResultFile "/t";
print ResultFile $bossid;
print ResultFile "/t";
print ResultFile $casestarttime;
print ResultFile "/t";
print ResultFile $caseendtime;
print ResultFile "/t";
print ResultFile $3;
print ResultFile "/t";
print ResultFile $4;
print ResultFile "/t";
print ResultFile $5;
print ResultFile "/t";
print ResultFile $1;
print ResultFile "/n";
}
}
这样,完全规避了对其中非ascii编码的处理。不管什么编码格式,都可以处理。
一旦有个别消息不能处理,丢弃的只是个别消息,而不会影响整个文件的处理。
XML::DOM过于庞大,而且解析结果是一个DOM树,操作也不方便。我们更多的是处理小型简单的XML文件,所以更多的是采用XML::Simple。
但不管是DOM还是Simple,当涉及到gb2312和GBK编码的时候,虽然对perl用encodeing = "GB2312 " 指定编码,但由于一些火星文,
还是常常解析出错。而且用这两个模块处理的时候,一旦出错,就导致整个文件不能解析。
对于特定的场合,完全可以用perl的正则匹配语法,来处理xml文件。
比如下面的文本
<m>
<c> 今日特价 【QQ商城千件秒杀】百事运动 防震缓冲慢跑男鞋 翼神 </c>
<i>0</i>
<y>0</y>
<t>20100605065101</t>
<k>250470602</k>
</m>
<m>
<c>我想今天买这双鞋</c>
<i>0</i>
<y>0</y>
<t>20100605065125</t>
<k>250470602</k>
</m>
首先,通过下面函数,将每一个消息隔开。注意其中消息可能换行的处理。
sub processmessages
{
my $processmessages = $_[0];
if($processmessages =~ /<message>(.*)<//message>/)
{
my $msgcont = $1;
while( $msgcont =~ /<m>(.*?)<//m>(.*)/ )
{
my $onemesg = $1;
#print "#########################/n";
&processonemsg($onemesg);
#print "/n########################/n";
}
}
}
然后对每条消息进行处理
sub processonemsg
{
my $mesg = $1;
if ($mesg =~ /<c>(.*)<i>(.*)<y>(.*)<//y><t>(.*)<//t><k>(.*)<//k>/)
{
print ResultFile $caseid;
print ResultFile "/t";
print ResultFile $bossid;
print ResultFile "/t";
print ResultFile $casestarttime;
print ResultFile "/t";
print ResultFile $caseendtime;
print ResultFile "/t";
print ResultFile $3;
print ResultFile "/t";
print ResultFile $4;
print ResultFile "/t";
print ResultFile $5;
print ResultFile "/t";
print ResultFile $1;
print ResultFile "/n";
}
}
这样,完全规避了对其中非ascii编码的处理。不管什么编码格式,都可以处理。
一旦有个别消息不能处理,丢弃的只是个别消息,而不会影响整个文件的处理。
相关文章推荐
- string.xml文件中整型和string型代替以及特殊转义符处理
- perl文件编码处理问题
- XML文件 特殊符号处理
- xml配置文件不能被正确解析的特殊符号的处理方法
- xml文件中特殊字符的处理
- xml配置文件特殊符号的处理方法
- flexpaper上传带中文名字的文档,在页面显示若出现404错误时,请在server.xml文件中进行编码utf-8
- perl对于utf8编码文件的substr
- C/C++编译预处理:宏定义指令、文件包含指令、条件编译指令和特殊符号处理
- XML_E_UNEXPECTED_WHITESPACE错误处理 xml特殊字符
- XMlDocument 处理 TTX文件文件变形
- XML中特殊字符的处理
- XML文件处理工具类 ---XMLUtils
- MySQL处理xml文件
- 文件处理-智能检测编码的工具(chardet)
- 写了一个简单的处理类似xml文件的类,请大家指正【原创】
- Java dom读取XML文件中特殊字符-报错
- weblogic上部署应用程序时,web.xml文件编码错误
- XML 处理 ,包括文件读写, in silverlight (silverlight系列(XML操作、HTTP通信、WebRequest通信))
- mybatis 多对一,xml 文件的处理 学习总结