DOM XML (PHP 4) 函数
在线手册:中文 英文
PHP手册

DomNode::set_content

(PHP 4 >= 4.1.0)

DomNode::set_content Sets content of node

说明

bool DomNode::set_content ( string $content )

Warning

本函数还未编写文档,仅有参数列表。


DOM XML (PHP 4) 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: Sets content of node

用户评论:

blah at pasher dot org (13-Jul-2006 11:42)

For those transitioning to PHP5 DOM XML code, there is a gotcha with this function.

In PHP4, when you call $node->set_content($string), the $string must have special HTML characters encoded. The method does not properly handle the "&" character, so this is required to properly set the content

In PHP5, when you call $node->appendChild($dom->createTextNode($string)), PHP will properly encode the "&" character without the need for HTML encoding.

Because of this, older code that is currently using htmlspecialchars() in the set_content() call will potentially double-encode the "&" character if you keep the call to htmlspecialchars() in the createTextNode() call.

dh at victory-sa dot com (28-Sep-2004 02:00)

function replace_content( &$node, $new_content )
{
    $dom = &$node->owner_document();
    $kids = &$node->child_nodes();
    foreach ( $kids as $kid )
        if ( $kid->node_type() == XML_TEXT_NODE )
            $node->remove_child ($kid);
    $node->set_content($new_content);
}

robinson at rsl dot com dot tw (05-Nov-2003 08:18)

If you want to set_content which is not in Alphabet, such as big5 charset, you have to use the iconv() to convert your codeset from big5 to something else, such as UTF-8. Here is a example:

$node->set_content(iconv("big5","UTF-8","This is a test.");
$node->set_content(iconv("big5","UTF-8","[Chinese Chars]");

These works find that won't dump garbage chars when your use dump_mem to file.

Ps. don't forget to include the php_iconv.dll

(28-Jun-2003 01:00)

As of 4.3.2:

$names = $contact->get_elements_by_tagname("name");
$name = $names[0];
$name_text_node = $name->first_child();
$name_text_node->set_content("Joe");

does not work.  Currently it looks like dom text nodes are implemented as "domtext", not "domelement" and therefore lack the set_content method.  As far as I've been able to tell, replacing is the best solution.

fivebull at 163 dot com (27-Mar-2003 03:02)

if you had used set_name() to change the node's tag name :

 $newnode =& $dom->create_element( $node->tagname );
should be:
 $newnode =& $dom->create_element(  $node->node_name());

ericb at computer dot org (14-Mar-2003 06:18)

Actually, don't forget that the text is actually a child node of the given element. The domxml coders decided to append to the content in the case that this function is called on a node which has children (to avoid a crash), but you shouldn't normally call it that way.

For example, if your document had:

<contact>
<name>Eric</name>
</contact>

and you wanted to change the content of the name element and $contact is the contact node, then you would use:

$names = $contact->get_elements_by_tagname("name");
$name = $names[0];
$name_text_node = $name->first_child();
$name_text_node->set_content("Joe");

Hope this clarifies things. Removing nodes, and inserting new ones is not an efficient solution :)

Cheers,

Eric

KDan (23-Sep-2002 02:21)

/**
 * Replace node contents
 *
 * Needed as a workaround for bug/feature of set_content
 * This version puts the content
 * as the first child of the new node.
 * If you need it somewhere else, simply
 * move $newnode->set_content() where
 * you want it.
 */
function replace_content( &$node, &$new_content )
{
    $dom =& $node->owner_document();
   
    $newnode =& $dom->create_element( $node->tagname );

    $newnode->set_content( $new_content );
   
    $atts =& $node->attributes();
    foreach ( $atts as $att )
    {
        $newnode->set_attribute( $att->name, $att->value );
    }
   
    $kids =& $node->child_nodes();
    foreach ( $kids as $kid )
    {
        if ( $kid->node_type() != XML_TEXT_NODE )
        {
            $newnode->append_child( $kid );
        }
    }
   
    $node->replace_node( $newnode );
}

KDan (05-Sep-2002 03:34)

As of v4.2.2 of PHP, with libxml version 2.4.19, set_content does not replace the content of the node, but only appends to it. Bug, feature, who knows!

To replace the content of a node, create a new node, copy the properties and children of the old node to the new one, then set the content of the new one and use replace_node to put it back into the DoM.

Daniel