首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >剥离CData标记

剥离CData标记
EN

Stack Overflow用户
提问于 2016-04-24 20:00:35
回答 2查看 545关注 0票数 1

在PHP中,只需执行以下操作就可以去掉XML中的CDATA标记:

代码语言:javascript
复制
simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA);

我想知道如何在Perl中使用XML::Bare或任何其他模块来实现这一点?

我的客户端倾向于发送这样的xml:

代码语言:javascript
复制
<msg t='sys'><body action='login' r='0'><login z='w1'><nick><![CDATA[Test]]></nick><pword><![CDATA[4c24a5558542bf35cca54d8749c78de6]]></pword></login></body></msg>

使用XML::Bare,我会像这样解析它:

代码语言:javascript
复制
$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。有人知道我该怎么做吗?我在网上到处寻找解决方案,却一直找不到解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-24 20:50:22

例如,以下内容:

代码语言:javascript
复制
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, "==";

打印没有CDATA的原始XML,如:

代码语言:javascript
复制
<?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==
票数 2
EN

Stack Overflow用户

发布于 2016-04-24 20:29:27

您可以尝试像这样使用HTML::Parser

代码语言:javascript
复制
#!/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变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36828251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档