note 98210 added to domdocument.createattributens
| From: | _michael at osu1 dot php dot net | Date: | Tue, 01 Jun 2010 14:35:20 +0000 |
| Subject: | note 98210 added to domdocument.createattributens | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-169784@lists.php.net to get a copy of this message | ||
If a new namespace is introduced while creating and inserting an attribute, createAttributeNS() does
not behave in the same way as createElementNS().
(1) Location: With createAttributeNS(), the new namespace is declared at the level of the document
element. By contrast, createElementNS() declares the new namespace at the level of the affected
element itself.
(2) Timing: With createAttributeNS(), the new namespace is declared in the document as soon as the
attribute is created - the attribute does not actually have to be inserted. createElementNS()
doesn't affect the document as long as the element is not inserted.
An example:
<?php
$source = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root><tag></tag></root>
XML;
/*
I. createAttributeNS:
* a new namespace shows up immediately, even without insertion of the attribute
* the new namespace is declared at the level of the document element
*/
$doc = new DOMDocument( '1.0' );
$doc->loadXML( $source );
// (1) We just create a "namespace'd" attribute without appending it to any
element.
$attr_ns = $doc->createAttributeNS( '{namespace_uri_here}',
'example:attr' );
print $doc->saveXML() . "\n";
/*
Result: The namespace declaration appears, having been added to the document element. Output:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:example="{namespace_uri_here}"><tag/></root>
*/
// (2) Next, we give the attribute a value and insert it.
$attr_ns->value = 'value';
$doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $attr_ns );
print $doc->saveXML() . "\n";
/*
Result: The "namespace'd" attribute shows up as well. Output:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:example="{namespace_uri_here}"><tag
example:attr="value"/></root>
*/
/*
II. createElementNS:
* a new namespace shows up only when the element is inserted
* the new namespace is declared at the level of the inserted element
*/
$doc = new DOMDocument( '1.0' );
$doc->loadXML( $source );
// (1) We create a "namespace'd" element without inserting it into the document.
$elem_ns = $doc->createElementNS( '{namespace_uri_here}',
'example:newtag' );
print $doc->saveXML() . "\n";
/*
Result: The document remains unchanged. Output:
<?xml version="1.0" encoding="UTF-8"?>
<root><tag/></root>
*/
// (2) Next, we insert the new element.
$doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $elem_ns );
print $doc->saveXML() . "\n";
/*
Result: The namespace declaration appears, and it is embedded in the element using it. Output:
<?xml version="1.0" encoding="UTF-8"?>
<root><tag><example:newtag
xmlns:example="{namespace_uri_here}"/></tag></root>
*/
?>
----
Server IP: 69.147.83.197
Probable Submitter: 91.57.106.39
----
Manual Page -- http://www.php.net/manual/en/domdocument.createattributens.php
Edit -- https://master.php.net/note/edit/98210
Del: integrated -- https://master.php.net/note/delete/98210/integrated
Del: useless -- https://master.php.net/note/delete/98210/useless
Del: bad code -- https://master.php.net/note/delete/98210/bad+code
Del: spam -- https://master.php.net/note/delete/98210/spam
Del: non-english -- https://master.php.net/note/delete/98210/non-english
Del: in docs -- https://master.php.net/note/delete/98210/in+docs
Del: other reasons-- https://master.php.net/note/delete/98210
Reject -- https://master.php.net/note/reject/98210
Search -- https://master.php.net/manage/user-notes.php