2016-04-24 128 views
1

在PHP中,你可以簡單地做剝離CDATA標籤XML如下:剝離CData的標籤XML的Perl

simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA); 

我不知道我怎麼會使用XML::Bare或任何其他模塊做到這一點在Perl?

我的客戶往往會發出這樣一個xml:

<msg t='sys'><body action='login' r='0'><login z='w1'><nick><![CDATA[Test]]></nick><pword><![CDATA[4c24a5558542bf35cca54d8749c78de6]]></pword></login></body></msg> 

使用XML ::裸我會分析它是這樣的:

$string = "<msg t='sys'><body action='login' r='0'><login z='w1'><nick><![CDATA[Test]]></nick><pword><![CDATA[4c24a5558542bf35cca54d8749c78de6]]></pword></login></body></msg>"; 
$strXML = XML::Bare->new('text' => $string)->parse; 
say $strXML->{msg}->{body}->{login}->{nick}->{value}; 

和它的作品,但我想脫光關閉cdata標籤以防止在我的服務器上進行sql注入。有誰知道我該如何去做這件事?我在網上搜索了一個解決方案,但一直沒能找到答案。

+0

什麼是從示例XML您預期的輸出? – simbabque

+0

[XML ::裸表示它會剝離](https://metacpan.org/pod/XML::Bare#Parsing-Limitations-Features)不需要的CDATA ... – simbabque

+0

我基本上想要一個沒有cdata解析的xml – Lucas

回答

2

例如以下:

use 5.014; 
use warnings; 
use XML::LibXML; 

#the input xml 
my $str = q{<msg t='sys'><body action='login' r='0'><login z='w1'><nick><![CDATA[Test]]></nick><pword><![CDATA[4c24a5558542bf35cca54d8749c78de6]]></pword></login></body></msg>}; 

#the parsing 
my $dom = XML::LibXML->load_xml(
    string => $str, 
    no_cdata => 1, #strip CDATA 
); 

#nice-print the parsed xml 
say $dom->toString(2); 

#print the "nick" and pword 
say "the nick is ==", $dom->find('//nick')->string_value, "=="; 
say "the pword is ==", $dom->find('//pword')->string_value, "=="; 

打印原始的XML無CDATA,如:

<?xml version="1.0"?> 
<msg t="sys"> 
    <body action="login" r="0"> 
    <login z="w1"> 
     <nick>Test</nick> 
     <pword>4c24a5558542bf35cca54d8749c78de6</pword> 
    </login> 
    </body> 
</msg> 

the nick is ==Test== 
the pword is ==4c24a5558542bf35cca54d8749c78de6== 
1

您可以嘗試使用HTML::Parser這樣的:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use HTML::Parser; 

my $xml = <<XML; 
<msg t='sys'><body action='login' r='0'><login z='w1'><nick><![CDATA[Test]]></nick><pword><![CDATA[4c24a5558542bf35cca54d8749c78de6]]></pword></login></body></msg> 
XML 

my $parsed_xml; 

HTML::Parser->new(default_h => [ sub { $parsed_xml .= shift }, 'text' ], 
    xml_mode => 1, 
    marked_sections => 1, 
)->parse($xml) or die $!; 

print $parsed_xml; 

marked_sections參數會導致解析器返回CDATA部分的內容作爲text,然後將連接到$parsed_xml變量。

+0

我想要做的就是刪除cdata標籤,但是保留了其中的值,就像我在上面註釋中發佈的xml – Lucas

+0

我已經更新了腳本滿足您的要求@盧卡斯 – bart