gpt4 book ai didi

php - SimpleXMLElement 在 addChild 和 addAttribute 中处理文本值的基本原理

转载 作者:IT王子 更新时间:2023-10-29 00:55:32 28 4
gpt4 key购买 nike

这不是不一致的行为吗? (PHP 5.2.6)

<?php

$a = new SimpleXMLElement('<a/>');

$a->addAttribute('b', 'One & Two');
//$a->addChild('c', 'Three & Four'); -- results in "unterminated entity reference" warning!
$a->addChild('c', 'Three &amp; Four');
$a->d = 'Five & Six';

print($a->asXML());

渲染:

<?xml version="1.0"?>
<a b="One &amp; Two">
<c>Three &amp; Four</c>
<d>Five &amp; Six</d>
</a>

在 bugs.php.net,他们拒绝所有关于此的提交,称这是一项功能。为什么会这样?顺便说一句,文档中没有关于 SimpleXMLElement 转义文本值的差异。

谁能说服我这是最好的 API 设计决策?

最佳答案

为了确保我们在同一页面上,您有三种情况。

  1. 使用 addAttribute 将 & 号插入到属性中

  2. 使用 addChild 将 & 符号插入到元素中

  3. 通过属性重载将&符号插入到元素中

令您困惑的是 2 和 3 之间的差异。为什么 addChild 不自动转义 & 符号,而向对象添加属性并设置其值自动转义 & 符号?

根据我的直觉,并受到 this bug 的鼓舞,这是一个深思熟虑的设计决定。属性重载 ($a->d = 'Five & Six';) 旨在成为“对我来说转义符号”的处理方式。 addChild 方法是“准确添加我告诉您添加的内容”方法。因此,无论您需要哪种行为,SimpleXML 都能满足您的需求。

假设您有一个文本数据库,其中所有与号都已转义。自动转义在这里对你不起作用。这就是您要使用 addChild 的地方。或者假设您需要在文档中插入一个实体

$a = simplexml_load_string('<root></root>');
$a->b = 'This is a non-breaking space &nbsp;';
$a->addChild('c','This is a non-breaking space &nbsp;');
print $a->asXML();

这就是那个 bug 中的 PHP 开发人员所提倡的。 addChild 的行为旨在在您需要在文档中插入一个符号而不对其进行转义时提供“更简单、更强大”的支持。

当然,这确实给我们留下了我提到的第一种情况,即 addAttribute 方法。 addAttribute 方法确实转义了“&”符号。所以,我们现在可以将不一致表述为

  1. addAttribute 方法对符号进行转义
  2. addChild 方法不会转义和符号
  3. 这种行为有些不一致。用户期望 SimpleXML 上的方法以一致的方式转义是合理的

这暴露了 SimpleXML api 的真正问题。这里的理想情况是

  1. 元素对象的属性重载转义和符号
  2. 属性对象的属性重载转义符号
  3. addChild 方法不转义 & 符号
  4. addAttribute 方法不转义 & 符号

虽然这是不可能的,因为 SimpleXML 没有属性对象的概念。 addAttribute 方法是(似乎是?)添加属性的唯一方法。因此,事实证明(似乎?)SimpleXML 无法使用实体创建属性。

所有这些都揭示了简单XML 的悖论。这个 API 背后的想法是提供一种简单的方式来与复杂的事物进行交互。

该团队本可以添加一个 SimpleXMLAttribute 对象,但这会增加一层复杂性。如果您想要多对象层次结构,请使用 DomDoument。

团队本可以向 addAttribute 和 addChild 方法添加标志,但标志会使 API 更加复杂。

真正的教训是什么?也许就是这么简单很难,在截止日期前简单更难。我不知道是否是这种情况,但是使用 SimpleXML 似乎有人从一个简单的想法开始(使用属性重载使 XML 文档的创建变得容易),然后根据出现的问题/功能请求进行调整.

实际上,我认为这里真正的教训是只使用 JSON ;)

关于php - SimpleXMLElement 在 addChild 和 addAttribute 中处理文本值的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552957/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com