php - 解析后PHP XML解析器CDATA关键字丢失
问题描述
我有以下 XML 代码,我想读取并获取“内容”标签内的值。
"<?xml version='1.0' encoding='ISO-8859-1'?>
<ad modelVersion='0.9'>
<richmediaAd>
<content>
<![CDATA[<script src=\"mraid.js\"></script>
<div class=\"celtra-ad-v3\">
<img src=\"data: image/png, celtra\" style=\"display: none\"onerror=\"(function(img){ varparams={ 'channelId': '45f3f23c','clickUrl': 'http%3a%2f%2fexamplehost.com%3a53766%2fCloudMobRTBWeb%2fClickThroughHandler.ashx%3fadid%3de6983c95-9292-4e16-967d-149e2e77dece%26cid%3d352%26crid%3d850'};varreq=document.createElement('script');req.id=params.scriptId='celtra-script-'+(window.celtraScriptIndex=(window.celtraScriptIndex||0)+1);params.clientTimestamp=newDate/1000;req.src=(window.location.protocol=='https: '?'https': 'http')+': //ads.celtra.com/e7f5ce18/mraid-ad.js?';for(varkinparams){req.src+='&'+encodeURIComponent(k)+'='+encodeURIComponent(params[ k ]); }img.parentNode.insertBefore(req, img.nextSibling);})(this);\"/>
</div>]]>
</content>
<width>320</width>
<height>50</height>
</richmediaAd>
</ad>"
我尝试了 2 种方法(SimpleXML 和 DOM)。我设法获得了该值,但发现缺少关键字“CDATA”。我在“内容”标签中得到的是:
<script src="mraid.js"></script>
<div class="celtra-ad-v3">
<img src="data: image/png, celtra" style="display: none"onerror="(function(img){ varparams={ 'channelId': '45f3f23c','clickUrl': 'http%3a%2f%2fexamplehost.com%3a53766%2fCloudMobRTBWeb%2fClickThroughHandler.ashx%3fadid%3de6983c95-9292-4e16-967d-149e2e77dece%26cid%3d352%26crid%3d850'};varreq=document.createElement('script');req.id=params.scriptId='celtra-script-'+(window.celtraScriptIndex=(window.celtraScriptIndex||0)+1);params.clientTimestamp=newDate/1000;req.src=(window.location.protocol=='https: '?'https': 'http')+': //ads.celtra.com/e7f5ce18/mraid-ad.js?';for(varkinparams){req.src+='&'+encodeURIComponent(k)+'='+encodeURIComponent(params[ k ]); }img.parentNode.insertBefore(req, img.nextSibling);})(this);"/>
</div>
我知道解析器试图通过删除 CDATA 来“美化”XML。但我想要的只是其中带有“CDATA”标签的原始数据。有什么办法可以做到这一点?感谢你的帮助。
以下是我的2种方法供您参考:方法1:
$type = simplexml_load_string($response['adm']) or die("Error: Cannot create object");
$data = $type->richmediaAd[0]->content;
Yii::warning((string) $data);
Yii::warning(strpos($data, 'CDATA'));
方法二:
$doc = new \DOMDocument();
$doc->loadXML($response['adm']);
$richmediaAds = ($doc->getElementsByTagName("richmediaAd"));
foreach($richmediaAds as $richmediaAd){
$contents = $richmediaAd->getElementsByTagName("content");
foreach($contents as $content){
Yii::warning($content->nodeValue);
}
}
解决方案
如果可以的话,我会改进这一点,但您可以明确定位内容元素的“CDATA 部分”节点,并使用$doc->saveXML( $node )
该节点作为参数来获得确切的 XML 元素结构。
$doc = new \DOMDocument();
$doc->loadXML( $xml );
$xpath = new \DOMXPath( $doc );
$nodes = $xpath->query( '/ad/richmediaAd/content');
foreach( $nodes[0]->childNodes as $node )
{
if( $node->nodeType === XML_CDATA_SECTION_NODE )
{
echo $doc->saveXML( $node ); // string content
}
}
编辑:如果没有找到 CDATA,您可能希望支持一些冗余。
没有 XPATH
$doc = new \DOMDocument();
$doc->loadXML( $xml );
$doc->normalize();
foreach( $doc->getElementsByTagName('content')->item(0)->childNodes as $node )
{
if( $node->nodeType === XML_CDATA_SECTION_NODE )
{
echo $doc->saveXML( $node ); // string content
}
}
推荐阅读
- php - 页面导航的 if 语句
- javascript - 如何解决 npm err 代码 elifecycle 错误?
- time-complexity - 特定循环的时间复杂度
- javascript - 角色列表命令发送对象而不是角色 discord.js
- powerbi-datasource - Business Central:如何使用 Power BI 从已过帐的销售发票行表中检索总收入(包括增值税)?
- apache-kafka - Kafka:错误关闭代理,因为 E:\kafka\data\kafka 中的所有日志目录都失败了 (kafka.log.LogManager)
- css - 如何通过断点扩展 Bootstrap 4 类
- javascript - 我在使用 Javascript 的 Whatsapp 共享中遇到问题
- nao-robot - NAOqi 版本中缺少 getDirectRawImageRemote()。2.8.6.23
- git - 重置 gitk GUI