当前位置: 首页 > 知识库问答 >
问题:

PHP XML实体未定义解析问题与simplexml_load_string和SimpleXMLElement addchild/addAtinn

卢枫涟
2023-03-14

使用PHP 5.3.13

simplexml_load_string在解析xml时抛出实体'分割'未定义错误。

这个问题的大多数解决方案都集中在如何处理SimpleXMLElement及其addchild和addAtinie方法上。这些方法将一些特殊字符转换为实体。解决方案似乎是说处理simplexml_load_string不理解的几个特殊角色。

问题是这个列表非常大,如果您在将要插入到XML addChilder中的$string上使用html实体($string,ENT_QUOTES,'UTF-8',true),那么它将添加罚款,但simplexml_load_string将在试图解析生成的XML时崩溃从SimpleXMLElement生成的as_xml。

另一个问题是生成的实体列表可能很长,但用户可以很容易地键入以下内容

想知道以下解决方案是否有效:更换

  1. SimpleXMLElement在addChild和addAttribute中处理文本值的基本原理-在这个问题上,但没有解决一般问题

以下是我可能的解决方案的一些示例代码:

$content_amp_safe = str_replace('&','&',$content);

以下是错误消息:

警告:simplexml_load_string():实体:第11行:解析器错误:未定义内部错误实体“divide”

下面是导致问题预解决方案的代码:

<?php
// insert that causes the issue with the windows encoded dash, triple dot, and right quote as an example
// also issue if user enters &pizza; in the text as it is an unknown entity
$content = "I love &pizza; in the … morning's  – night as well";
$content_unsafe = htmlentities($content, ENT_QUOTES, 'UTF-8', true);
//fix is to use $content_amp_safe string instead
$content_amp_safe = str_replace('&','&amp;',$content_unsafe);
$xml = new SimpleXMLElement("<?xml version='1.0' encoding='utf-8'?><Entries />");
$entry = $xml->addChild('Entry');
$entry->addChild('Content', $content);
$xml_string = $xml->asXML();
libxml_use_internal_errors(true);
$xml = simplexml_load_string($xml_string);
if ($xml === false) {
    $error_string = "Failed loading XML\n";
    foreach ( libxml_get_errors() as $error ) {
        $error_string .= "\t" . $error->message;
    }
    echo $error_string;
}
libxml_use_internal_errors(false);
?>

在用户输入时使用htmlentities会导致问题的某些字符的简短版本。

<?php 
 $table = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES, 'cp1252');
 var_dump($table);
?>

示例字符:

€‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

编码示例:

€‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ

新编码示例:

共有1个答案

寿丰
2023-03-14

您的观察是正确的,simplexmlement::addChild()(和::addAttribute())将(仅)一些特殊字符转换为实体。

这是为了逐字输入一些字符(尤其是“

然而,在你的情况下,你不想这样。要转换所有特殊字符,需要通过属性访问设置XML元素的文本值,例如:

$entry->Content = $content;

如您所见,$entry-

$entry->addChild('Content')->{0} = $content;

一个完整的例子:

$content = "I love &pizza; in the … morning's  – night as well";

$xml = new SimpleXMLElement("<Entries />");
$entry = $xml->addChild('Entry');
$entry->Content = $content;
$entry->addChild('Content')->{0} = $content;

echo $xml->asXML();

输出(美化):

<?xml version="1.0"?>
<Entries>
  <Entry>
    <Content>I love &amp;pizza; in the … morning's  – night as well</Content>
    <Content>I love &amp;pizza; in the … morning's  – night as well</Content>
  </Entry>
</Entries>

我希望现在不会太混乱。

在使用&号的问题旁边,您可能会看到一些字符编码问题。对于这些,有一个简单的规则:每当您将字符串传递给SimpleXMLElement时,该字符串的编码必须是UTF-8。

 类似资料:
  • 由于某种原因,我遇到了一个解析错误。我把范围缩小到“什么”,而不是“为什么”。 以下是我的测试脚本: 通过上面的测试xml字符串,我得到了“无法…”条件然而,当我取出“”时,它工作了!显然simplexml_load_string()有一些细节。但我收到了这个带有的响应,我不想首先执行查找/替换脚本。 还有,我这样做对吗?最后,我需要开始解析CUS帐户,提取其中的数据。

  • simplexml_load_string()似乎不是以下xml的工作形式 上面的xml是响应的一部分,因此当得到结果时,它只包含属性 结果是SimpleXMLElement的一个对象,只有一个属性数组 它没有任何与“Chat_valiable”或隐藏相关的内容。 能找个人帮忙吗

  • 问题内容: 这段代码在Swift 1.1中运行良好…只是试图找出1.2中所做的更改以使其不兼容: 它给了我错误: 无法使用类型为’(String,block:(PFObject !, NSError)- > Void)的参数列表调用’GetObjectInBackgroundWithId’ 有任何想法吗?谢谢! 问题答案: 现在,使用Swift 1.2时,您应该更加谨慎地展开可选项。因此,在具有和

  • 我有基于Eclipse Luna 4.4.1的STS版本3.6.3.SR1。 我做了以下步骤: > 我退出并从快捷方式以及STS.exe的绝对位置打开STS。 即使在进行了上述所有活动之后,仍然存在许多编译器问题,这些问题会导致在所有或或注释上出现未定义的方法。 Maven构建成功运行并且运行时行为很好,因为遵从的类似乎有getter和setter。 IntelliJ在这方面似乎没有问题,因为其他

  • 当我尝试发送一个GET请求到我的Spring Boot应用程序时,我有这个错误,我不知道我错过了什么! 我有了这个数据库,并在Eclipse中创建了JPA实体和关系,相应地为Spring Boot项目安装了STS(Spring Tool Suite)。 portata.java Ristorante.java Tipocucina.java 我错过了什么???

  • 对于任何一个 ORM 工具,大都是根据配置者约定了解你打算怎么把一张数据表与你的 Java 对象 映射到一起。默认的 Nutz.Dao 采用 Java 注解(Annotation) 的方式描述这个映射,但是,当然 世界上还有很多其它的映射方式,比如用各种配置文件,比如 JPA 的注解,或者你很想把这个 映射关系写在数据库的几张表里,甚至一个 Excel 表格里(你就觉得这样很酷) 从 1.b.38