我遇到了SimpleXML的问题。就像在官方文档中一样,我想这样做:
<?php
include 'example.php';
$movies = new SimpleXMLElement($xmlstr);
$movies->movie[0]->characters->character[0]->name = 'Miss Coder';
echo $movies->asXML();
?>
但我的代码是:
<?php
public function renderMarker($xml, &$html)
{
$html = ((string) $html) . 'Text to add';
}
?>
with:
$html = object(SimpleXMLElement)#185 (1) {
["@attributes"]=>
array(1) {
["id"]=>
string(5) "title"
}
}
但是当我这样做时,我得到了$html = string(12) "Text to add"
。
有没有人知道这方面的工作。
提前谢谢。
答案 0 :(得分:0)
您尝试实现的功能不起作用,而SimpleXML没有解决方案。
每个SimpleXML对象都有动态属性。您可以访问它们 - 如果它们是对象的属性,但实际上,每次访问它们时,都会给出属性的返回值(读取)或更新其他内容(写入)。
但是,如果将这些属性传递给类似的函数,则只传递实际的返回值(来自读数),而不是属性本身。
Simpliefied示例不起作用,因为$xml->title
不作为变量传递到set_property
函数中(不需要添加引用,它没有区别):
$xmlStr = '<root><title></title></root>';
$xml = new SimpleXMLElement($xmlStr);
function set_property(&$prop)
{
$prop = 'Test';
}
set_property($xml->title);
echo $xml->asXML();
输出:
<?xml version="1.0"?>
<root><title/></root>
正如所写,没有简单的解决方法。一种解决方法是您自己创建一个SimpleXMLProperty对象,您可以在函数参数中传递它:
/**
* Encapsulate SimpleXMLElement Property
*/
class SimpleXMLProperty
{
private $obj, $prop;
public function __construct(SimpleXMLElement $obj, $property)
{
$this->obj = $obj;
$this->prop = $property;
}
public function get()
{
return $this->obj->{$this->prop};
}
public function set($value)
{
$this->obj->{$this->prop} = $value;
}
}
$xmlStr = '<root><title></title></root>';
$xml = new SimpleXMLElement($xmlStr);
function set_property(SimpleXMLProperty $prop)
{
$prop->set('Test');
}
$property = new SimpleXMLProperty($xml, 'title');
set_property($property);
echo $xml->asXML();
输出:
<?xml version="1.0"?>
<root><title>Test</title></root>
它封装了属性并在读取和写入上下文中访问它,具体取决于名为(Demo)的get或set函数。
但是对于你构建的内容,改为调查DomDocument可能更好。它有一个更加标准化的DOM接口,你实际上传递了已经存在的对象,比如文本节点。