SimpleXMLElement做法(在写上下文中传递属性)

时间:2011-10-10 14:23:54

标签: php simplexml

我遇到了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"。 有没有人知道这方面的工作。 提前谢谢。

1 个答案:

答案 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接口,你实际上传递了已经存在的对象,比如文本节点。