我正在使用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,请不要扩展实体相关推荐

  1. ebnf描述c语言语句结构,EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则...

    Presentation on theme: "EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构:并用操作语义的方法描述对应的语义规则"- Pre ...

  2. 无法添加 WebEx 扩展插件。请重试。

    问题描述:通过chrome,360安装web会议插件无法安装成功. 报错内容:无法添加 WebEx 扩展插件.请重试. 解决办法:WebEx的插件需要在google的应用商店里安装,如果访问不了goo ...

  3. php扩展管理配置信息,PHP扩展管理 - 城市之雾的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.php扩展管理 1.什么是php扩展 php扩展就是php核心并不支持的功能,然后可以通过扩展的方式进行扩展PHP的功能,常见的扩展如MySQL,gb2等等. 2.查看php安装了那些扩展 方法一 ...

  4. 扩展方法 枚举值_扩展枚举功能的两种方法

    扩展方法 枚举值 前言 在上一篇文章中,我解释了如何以及为什么在Java代码中使用enums而不是switch/case控制结构. 在这里,我将展示如何扩展现有enums功能. 介绍 Java enu ...

  5. Java操作——获取文件扩展名,去掉文件扩展名

    昨天收邮件,得知要参加一个产品部的会议,猜想,也许是因为我做的这个产品demo问题.于是昨天忙活到凌晨3点半,结果早上一来才知道又被调戏了.发邮件的MM把邮件误发给我了.悲催啊有木有,困啊有木有!自己 ...

  6. joomla tab 扩展_如何使用扩展功能扩展Joomla网站的功能

    joomla tab 扩展 Joomla被独立评论网站CMS Critic评为2018年度最佳免费CMS ,它是全球最受欢迎的网站内容管理系统(CMSes)之一. 与WordPress一样, Joom ...

  7. 扩展bash_Bash中的参数扩展简介

    扩展bash 在Bash中,存储值的实体称为参数. 它们的值可以是具有常规语法的字符串或数组,也可以是整数或关联数组(当使用内置声明的特殊属性设置时). 参数共有三种:位置参数,特殊参数和变量. 为了 ...

  8. 横向扩展 纵向扩展 数据库_理解数据库扩展模式的指南

    横向扩展 纵向扩展 数据库 There are lot of articles online describing database scalability patterns, but they ar ...

  9. mysql横向扩展_转mysql横向扩展和纵向扩展

    Scale - up (纵向扩展)和 Scale -out (横向扩展)的解释 谈到系统的可伸缩性, Scale - up (纵向扩展)和 Scale -out (横向扩展)是两个常见的术语,对于初学 ...

最新文章

  1. 关于fseek和文件ab+打开方式的问题
  2. Android:手把手教你 实现Activity 与 Fragment 相互通信(含Demo)
  3. C#读取Excel显示到repeater中
  4. 命令行参数实现10万行小字典程序并输出查找时间
  5. centos mysql 新增用户
  6. python——shape 与reshape
  7. O-C相关-08-动态类型与静态类型
  8. macos支持exfat吗_在Windows上使用VMware Workstation虚拟机安装macOS
  9. 记录:成功配置 centos + nginx + .net core 2.0
  10. 启动conda环境_Python入门环境搭建anaconda
  11. 携号转网不会有多大影响
  12. C# MP3操作类,能播放指定的mp3文件,或播放嵌入的资源中的Mp3文件
  13. 计算机科学与技术专业导论mooc答案,中国大学MOOC人工智能导论(2017级)网课答案...
  14. python visio_再见,Visio! - Python绿色通道的个人空间 - OSCHINA - 中文开源技术交流社区...
  15. VS2010下载地址和安装教程(图解)
  16. java xml字符串转换成对象_将XML字符串转换为对象
  17. 关于游戏中美术文件夹的划分
  18. 悟空CRM系统项目测试
  19. MC33063电源啸叫
  20. leetcode 最长单词

热门文章

  1. RAID5阵列掉盘显示未初始化---解决过程
  2. 如何配置cmd操作XAMPP中的MYSQL的运行环境?
  3. 管状合金电阻和片状合金电阻的区别_SAE 6118、高电阻合金际锻材
  4. php的auth权限类源码
  5. oracle 表收缩,Oracle 收缩表大小 Oracle Shrink Table
  6. oracle如何删除物理表空间,oracle 如何删除被误删物理文件的表空间
  7. 乐橙tp6接入硬盘_乐橙“智能养殖”新概念,全套监管最佳组合方案曝光!
  8. ie中加入html代码,IE中HTML编辑器的修改与使用
  9. 重庆中职高考计算机专业试题,职业高中高考计算机专业试卷3答案
  10. 盗墓笔记android,盗墓笔记手游下载