php xml扩展,php-SimpleXML,请不要扩展实体
我正在使用SimpleXML尝试使用
我曾考虑过“预解析” XML文件,以在将文件内容传递给XML解析器之前去掉
(请原谅上面的任何错误术语;我已经很长时间没有完成此级别的XML了.)
解决方法:
看起来似乎是这样,但事实并非如此(除非您指定标志,尽管您没有在代码中显示您所做的事情,但我猜您不会这么做).仅当您使用-> asXML()方法而不通过to-string-implementation时,SimpleXML才能将其返回给您.
让我们做一些例子来演示它是如何工作的.我从DTD中选择了以下简单实体:
因此,让我们选择第一个< pos>元素,因为它包含& n;实体:
$xml = simplexml_load_file($file);
$pos = $xml->entry->sense->pos;
变量$pos现在是< pos>的SimpleXMLElement.元素节点.让我们输出它,以查看解析器对& n;做些什么.实体:
echo "SimpleXML value (string): ", $pos , "\n"
, "SimpleXML value (XML) : ", $pos->asXML(), "\n";
输出为:
SimpleXML value (string): noun (common) (futsuumeishi)
SimpleXML value (XML) : &n;
如本例所示,& n;仍然在那儿(< pos& n;< / pos>),只是当您将其作为字符串值(名词(普通)(futsuumeishi))访问时,它将被扩展.
顺便说一句,这完全可以,XML规范在这里说,是否扩展这些实体取决于解析器.对于SimpleXML的设计目的,在读取字符串值时,这完全可以扩展.
您甚至可以通过指定LIBXML_NOENT选项来控制此行为:
$xml = simplexml_load_file($file, NULL, LIBXML_NOENT);
这实际上将执行您假设的操作,现在扩展实体,XML输出不再包含该实体:
SimpleXML value (string): noun (common) (futsuumeishi)
SimpleXML value (XML) : noun (common) (futsuumeishi)
因此,现在出现双重问号了,该怎么做?嗯,PHP中的XML解析器实际上是实体模型,它是DOMDocument.它是SimpleXML的姊妹库,内部都共享相同的内存对象.这是不使用LIBXML_NOENT和使用LIBXML_NOENT的两种模式的同一对象(更精确的是:其唯一的子节点)的输出:
Mode 1:
DOMDocument Class : DOMEntityReference
DOMDocument value(XML) : &n;
DOMDocument ->nodeName : n
Mode 2 (LIBXML_NOENT):
DOMDocument Class : DOMText
DOMDocument value(XML) : noun (common) (futsuumeishi)
DOMDocument ->nodeName : #text
这是由以下代码创建的,这些代码应使给定输出背后的内容更清晰可见:
$node = dom_import_simplexml($pos);
$doc = $node->ownerDocument;
$entity = $node->firstChild;
echo "DOMDocument Class : ", get_class($entity) , "\n"
, "DOMDocument value(XML) : ", $doc->saveXML($entity), "\n"
, "DOMDocument ->nodeName : ", $entity->nodeName , "\n";
如所写,它是一个姊妹库,而dom_import_simplexml将$pos变成一个DOMElement,我们需要遍历该子元素的子元素,我们知道这是有问题的实体引用.
因此,现在这已经很有意义了:由于SimpleXML无法表示实体引用,因此只能提供扩展的字符串值或包含实体的XML.
否则,如何区别的字符串值
&n;
?因此,您所要求的只有有限的意义.但这并不意味着我们无法处理,因此可以通过扩展SimpleXML来欺骗SimpleXML.假设每个仅包含单个实体的子元素都应返回so.否则,应使用标准的SimpleXML stringyfication:
/**
* Class EntityPreserveXML
*/
class EntityPreserveXML extends SimpleXMLElement
{
/**
* @return string
*/
public function __toString()
{
$dom = dom_import_simplexml($this);
if (
!$dom instanceof DOMElement
|| $dom->childNodes->length !== 1
|| ! $dom->firstChild instanceof DOMEntityReference
) {
return parent::__toString();
}
return $dom->ownerDocument->saveXML($dom->firstChild);
}
}
让我们在上面的示例中运行它:
require('EntityPreserveXML.php');
$xml = simplexml_load_file($file, 'EntityPreserveXML');
$pos = $xml->entry->sense->pos;
echo "SimpleXML value (string): ", $pos , "\n"
, "SimpleXML value (XML) : ", $pos->asXML(), "\n";
SimpleXML现在正在使用扩展类,该扩展类将按预期提供:
SimpleXML value (string): &n;
SimpleXML value (XML) : &n;
& n;因为它是唯一的孩子,所以现在保留在SimpleXMLElement的字符串转换中.但是,仅因为这种方法不一定意味着您应该使用它,否则它就打破了文本形式的已解析XML与文档模型意义上的XML之间的编码边界.
可能您只是在寻找DOMDocument?这是一个具有更多详细信息的模型,您可以从中使用DOMEntityReferences(如果有).
标签:php,xml,simplexml
来源: https://codeday.me/bug/20191011/1889959.html
php xml扩展,php-SimpleXML,请不要扩展实体相关推荐
- ebnf描述c语言语句结构,EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则...
Presentation on theme: "EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构:并用操作语义的方法描述对应的语义规则"- Pre ...
- 无法添加 WebEx 扩展插件。请重试。
问题描述:通过chrome,360安装web会议插件无法安装成功. 报错内容:无法添加 WebEx 扩展插件.请重试. 解决办法:WebEx的插件需要在google的应用商店里安装,如果访问不了goo ...
- php扩展管理配置信息,PHP扩展管理 - 城市之雾的个人空间 - OSCHINA - 中文开源技术交流社区...
一.php扩展管理 1.什么是php扩展 php扩展就是php核心并不支持的功能,然后可以通过扩展的方式进行扩展PHP的功能,常见的扩展如MySQL,gb2等等. 2.查看php安装了那些扩展 方法一 ...
- 扩展方法 枚举值_扩展枚举功能的两种方法
扩展方法 枚举值 前言 在上一篇文章中,我解释了如何以及为什么在Java代码中使用enums而不是switch/case控制结构. 在这里,我将展示如何扩展现有enums功能. 介绍 Java enu ...
- Java操作——获取文件扩展名,去掉文件扩展名
昨天收邮件,得知要参加一个产品部的会议,猜想,也许是因为我做的这个产品demo问题.于是昨天忙活到凌晨3点半,结果早上一来才知道又被调戏了.发邮件的MM把邮件误发给我了.悲催啊有木有,困啊有木有!自己 ...
- joomla tab 扩展_如何使用扩展功能扩展Joomla网站的功能
joomla tab 扩展 Joomla被独立评论网站CMS Critic评为2018年度最佳免费CMS ,它是全球最受欢迎的网站内容管理系统(CMSes)之一. 与WordPress一样, Joom ...
- 扩展bash_Bash中的参数扩展简介
扩展bash 在Bash中,存储值的实体称为参数. 它们的值可以是具有常规语法的字符串或数组,也可以是整数或关联数组(当使用内置声明的特殊属性设置时). 参数共有三种:位置参数,特殊参数和变量. 为了 ...
- 横向扩展 纵向扩展 数据库_理解数据库扩展模式的指南
横向扩展 纵向扩展 数据库 There are lot of articles online describing database scalability patterns, but they ar ...
- mysql横向扩展_转mysql横向扩展和纵向扩展
Scale - up (纵向扩展)和 Scale -out (横向扩展)的解释 谈到系统的可伸缩性, Scale - up (纵向扩展)和 Scale -out (横向扩展)是两个常见的术语,对于初学 ...
最新文章
- 关于fseek和文件ab+打开方式的问题
- Android:手把手教你 实现Activity 与 Fragment 相互通信(含Demo)
- C#读取Excel显示到repeater中
- 命令行参数实现10万行小字典程序并输出查找时间
- centos mysql 新增用户
- python——shape 与reshape
- O-C相关-08-动态类型与静态类型
- macos支持exfat吗_在Windows上使用VMware Workstation虚拟机安装macOS
- 记录:成功配置 centos + nginx + .net core 2.0
- 启动conda环境_Python入门环境搭建anaconda
- 携号转网不会有多大影响
- C# MP3操作类,能播放指定的mp3文件,或播放嵌入的资源中的Mp3文件
- 计算机科学与技术专业导论mooc答案,中国大学MOOC人工智能导论(2017级)网课答案...
- python visio_再见,Visio! - Python绿色通道的个人空间 - OSCHINA - 中文开源技术交流社区...
- VS2010下载地址和安装教程(图解)
- java xml字符串转换成对象_将XML字符串转换为对象
- 关于游戏中美术文件夹的划分
- 悟空CRM系统项目测试
- MC33063电源啸叫
- leetcode 最长单词
热门文章
- RAID5阵列掉盘显示未初始化---解决过程
- 如何配置cmd操作XAMPP中的MYSQL的运行环境?
- 管状合金电阻和片状合金电阻的区别_SAE 6118、高电阻合金际锻材
- php的auth权限类源码
- oracle 表收缩,Oracle 收缩表大小 Oracle Shrink Table
- oracle如何删除物理表空间,oracle 如何删除被误删物理文件的表空间
- 乐橙tp6接入硬盘_乐橙“智能养殖”新概念,全套监管最佳组合方案曝光!
- ie中加入html代码,IE中HTML编辑器的修改与使用
- 重庆中职高考计算机专业试题,职业高中高考计算机专业试卷3答案
- 盗墓笔记android,盗墓笔记手游下载