- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这不是不一致的行为吗? (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 & Four');
$a->d = 'Five & Six';
print($a->asXML());
渲染:
<?xml version="1.0"?>
<a b="One & Two">
<c>Three & Four</c>
<d>Five & Six</d>
</a>
在 bugs.php.net,他们拒绝所有关于此的提交,称这是一项功能。为什么会这样?顺便说一句,文档中没有关于 SimpleXMLElement 转义文本值的差异。
谁能说服我这是最好的 API 设计决策?
最佳答案
为了确保我们在同一页面上,您有三种情况。
使用 addAttribute 将 & 号插入到属性中
使用 addChild 将 & 符号插入到元素中
通过属性重载将&符号插入到元素中
令您困惑的是 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 ';
$a->addChild('c','This is a non-breaking space ');
print $a->asXML();
这就是那个 bug 中的 PHP 开发人员所提倡的。 addChild 的行为旨在在您需要在文档中插入一个符号而不对其进行转义时提供“更简单、更强大”的支持。
当然,这确实给我们留下了我提到的第一种情况,即 addAttribute 方法。 addAttribute 方法确实转义了“&”符号。所以,我们现在可以将不一致表述为
这暴露了 SimpleXML api 的真正问题。这里的理想情况是
虽然这是不可能的,因为 SimpleXML 没有属性对象的概念。 addAttribute 方法是(似乎是?)添加属性的唯一方法。因此,事实证明(似乎?)SimpleXML 无法使用实体创建属性。
所有这些都揭示了简单XML 的悖论。这个 API 背后的想法是提供一种简单的方式来与复杂的事物进行交互。
该团队本可以添加一个 SimpleXMLAttribute 对象,但这会增加一层复杂性。如果您想要多对象层次结构,请使用 DomDoument。
团队本可以向 addAttribute 和 addChild 方法添加标志,但标志会使 API 更加复杂。
真正的教训是什么?也许就是这么简单很难,在截止日期前简单更难。我不知道是否是这种情况,但是使用 SimpleXML 似乎有人从一个简单的想法开始(使用属性重载使 XML 文档的创建变得容易),然后根据出现的问题/功能请求进行调整.
实际上,我认为这里真正的教训是只使用 JSON ;)
关于php - SimpleXMLElement 在 addChild 和 addAttribute 中处理文本值的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552957/
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP addAttribute()函数讲解由作者收集整理,如果你对这篇
我是第一次使用 SimpleXMLElement,需要在我的 XML 中生成一行,如下所示: 我之前没有对命名空间使用过 addAttribute 并且无法在这里使用正确的语法 - 我已经开始了:
我有这部分代码: var hasAttribute = TypeDescriptor.GetAttributes(property.DeclaringType).OfType()
我是 Spring MVC 框架的新手。我正在做一些自学以扩展我在 Java 方面的知识。 这是我从我正在关注的教程中理解 getProducts() 代码定义的方式,但如果我错了,请纠正我。 Con
例如以下代码内存安全吗? NSMutableAttributedString *str = ...; CTFontRef aFont = CTFontCreateWithName((CFStringR
我刚刚开始涉足 Spring MVC。我正在使用外部加密货币 API。我尝试使用 for every 循环来迭代 JSON 响应,以使用 addAttribute 方法将每个值插入到模型中。不过我只得
描述: 像 addAttribute("attrname", "") 这样的调用会导致“PHP 警告:SimpleXMLElement::addAttribute():需要属性名称和值”。除了警告之外
我查了 documentation方法就在那里。 当我查看 .h 文件时,我确实看到了该功能。我尝试清理和重建,但在迁移到 Swift 4 后仍然出现此错误。 Value of type 'NSAtt
我正在寻找一种方法,将句子中的第一个单词着色为与句子其余部分不同的颜色。 METHOD_001 首先将整个字符串设置为白色,然后将前 8 个字符重新设置为红色。 METHOD_002 将前 8 个字符
美好的一天,我正在学习Spring MVC,并且在this tutorial之后编写了我的小型Web应用程序,但是我对其进行了稍微的修改,将其作为“任务列表”而不是“用户列表”。我不清楚一件事,所以我
我想在 magento 中为我的产品设置一个新的属性集。该属性应该是从某些选项中选择的类型。 $installer->addAttribute('catalog_product', 'reserve'
我正在尝试更改Xamarin.iOS中UILabel中链接的样式。 我编写了以下代码,并且NSMutableAttributedString已正确更新。 但是,不会呈现更新的样式。 我想念什么吗? 我
我创建了具有不同属性的 NSMutableAttributedString,然后为一个范围添加了粗体属性。示例 let attText = NSMutableAttributedString(stri
我在无法重现的字段中调用 addAttributes 时经常崩溃 (EXC_BREAKPOINT)。对我传入的 NSRange 添加了检查,令人惊讶的是它仍然崩溃......非常感谢收到任何想法! l
我正在尝试添加到 UITextViews 的链接,所以我遵循 this post 中的代码.相关的Objective-C代码是 NSMutableAttributedString *attribute
本文整理了Java中cdc.util.xml.XmlWriter.addAttribute()方法的一些代码示例,展示了XmlWriter.addAttribute()的具体用法。这些代码示例主要来源
本文整理了Java中bibliothek.util.xml.XElement.addAttribute()方法的一些代码示例,展示了XElement.addAttribute()的具体用法。这些代码示
好吧,也许我漏掉了一些简单的东西。我一直在寻找很长一段时间,但没有运气。我需要将实体插入到 XML 属性中。为此,我需要能够将符号 (&) 与 DOM 类的 setAttribute 方法(或 sim
到目前为止,我的理解是关于我们的 Controller 请求映射方法,我们可以指定 RedirectAttributes 参数并在请求被重定向时使用属性填充它。 示例: @RequestMapping
本文整理了Java中com.manydesigns.elements.xml.XhtmlBuffer.addAttribute()方法的一些代码示例,展示了XhtmlBuffer.addAttribu
我是一名优秀的程序员,十分优秀!