To create elements with attributes,
<?php
function createElement($domObj, $tag_name, $value = NULL, $attributes = NULL)
{
$element = ($value != NULL ) ? $domObj->createElement($tag_name, $value) : $domObj->createElement($tag_name);
if( $attributes != NULL )
{
foreach ($attributes as $attr=>$val)
{
$element->setAttribute($attr, $val);
}
}
return $element;
}
$dom = new DOMDocument('1.0', 'utf-8');
$elm = createElement($dom, 'foo', 'bar', array('attr_name'=>'attr_value'));
$dom->appendChild($elm);
echo $dom->saveXML();
?>
outputs :
<?xml version="1.0" encoding="utf-8"?>
<foo attr_name="attr_value">bar</foo>
DOMDocument::createElement
(PHP 5)
DOMDocument::createElement — 新しい要素ノードを作成する
説明
この関数は、DOMElement クラスの新しいインスタンスを作成します。 このノードは、(たとえば) DOMNode->appendChild() などで 挿入されない限り、ドキュメント内に現われません。
パラメータ
- name
-
要素のタグ名。
- value
-
要素の値。デフォルトでは、空の要素が作成されます。 その後に DOMElement->nodeValue で 値を設定することも可能です。
返り値
新しい DOMElement クラスの新しいインスタンス、 あるいはエラーが発生した場合は FALSE を返します。
エラー / 例外
- DOM_INVALID_CHARACTER_ERR
-
name が無効な文字を含んでいる場合に発生します。
例
例1 新しい要素を作成し、ルートとして挿入する
<?php
$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->createElement('test', 'This is the root element!');
// 新しい要素をルート (ドキュメントの子要素) として挿入する
$dom->appendChild($element);
echo $dom->saveXML();
?>
上の例の出力は以下となります。
<?xml version="1.0" encoding="iso-8859-1"?> <test>This is the root element!</test>
参考
- DOMNode::appendChild - 子要素群の最後に新しい子要素を追加する
- DOMDocument::createAttribute - 新しい属性を作成する
- DOMDocument::createAttributeNS - 関連付けられた名前空間に新しい属性を作成する
- DOMDocument::createCDATASection - 新しい cdata ノードを作成する
- DOMDocument::createComment - 新しい comment ノードを作成する
- DOMDocument::createDocumentFragment - 新しい文書片を作成する
- DOMDocument::createElementNS - 関連付けられた名前空間に新しい要素を作成する
- DOMDocument::createEntityReference - 新しいエンティティ参照ノードを作成する
- DOMDocument::createProcessingInstruction - 新しい PI ノードを作成する
- DOMDocument::createTextNode - 新しいテキストノードを作成する
DOMDocument::createElement
yasindagli at gmail dot com
17-Jun-2009 06:01
17-Jun-2009 06:01
chris AT cmbuckley DOT co DOT uk
26-May-2009 11:45
26-May-2009 11:45
Note that the NUL character "\0" is not in the list of invalid characters for $name, so no error is triggered, but the tag name will be truncated at the null byte:
<?php
$dom = new DOMDocument('1.0', 'utf-8');
$el = $dom->createElement('foo' . "\0" . 'bar', 'Hello World');
echo $el->tagName; // outputs "foo"
?>
poison
06-Jul-2007 02:11
06-Jul-2007 02:11
In response to 'mikek dot nospam at nospam dot muonics dot com', here is a more correct version, as values have to be UTF-8 encoded, and there's absolutely no reason to create an extra DOMElement class.
<?php
class ADOMDocument extends DOMDocument {
function __construct($version = null, $encoding = null) {
parent::__construct($version, $encoding);
}
public function createElement($tagName, $value=null) {
$node=parent::createElement($tagName);
if (!is_null($value)) {
$node->appendChild(
$this->createTextNode(utf8_encode($value))
);
}
return $node;
}
public function createElementNS($namespaceURI, $qualifiedName, $value=null) {
$node=parent::createElementNS($namespaceURI, $qualifiedName);
if (!is_null($value)) {
$node->appendChild(
$this->createTextNode(utf8_encode($value))
);
}
return $node;
}
}
?>
estill at gvtc dot com
13-Jun-2007 06:38
13-Jun-2007 06:38
Note that the second parameter (value), although convenient, is non-standard. You should create elements like this instead:
<?php
$doc = new DOMDocument('1.0', 'iso-8859-1');
$root = $doc->createElement('test');
$doc->appendChild($root);
$root_text = $doc->createTextNode('This is the root element!');
$root->appendChild($root_text);
print $doc->saveXML();
?>
Or, alternatively, extend the DOMDocument class and add your own custom, convenience method to avoid intruding on the standard:
<?php
class CustomDOMDocument extends DOMDocument {
function createElementWithText($name, $child_text) {
// Creates an element with a child text node
// @param string $name element tag name
// @param string $child_text child node text
// @return object new element
$element = $this->createElement($name);
$element_text = $this->createTextNode($child_text);
$element->appendChild($element_text);
return $element;
}
}
$doc = new CustomDOMDocument('1.0', 'iso-8859-1');
$root = $doc->createElementWithText('test', 'This is the root element!');
$doc->appendChild($root);
print $doc->saveXML();
?>
Also use caution with (or avoid) the 'DOMElement->nodeValue' property. It can return some unexpected values and changing its value will replace (remove) all descendants of the element with a single text node. It's also non-standard; according to the DOM spec it should return NULL.
mikek dot nospam at nospam dot muonics dot com
04-Mar-2007 10:24
04-Mar-2007 10:24
With regard to the note below about needing htmlentities to avoid warnings about unterminated entity references, I thought it worthwhile to mention that that you don't need to with createTextNode and DOMText::__construct. If you mix both methods of setting text nodes and do (or don't) apply htmlentities consistently to all data to be displayed, you'll get &s (or warnings and badly-formed xml).
It's probably in one's best interest to extend DOMElement and DOMDocument so that it creates a DOMText node and appends it, rather than passing it up to the DOMElement constructor. Otherwise, good luck using (or not using) htmlentities in all the right places in your code, especially as code changes get made.
<?php
class XDOMElement extends DOMElement {
function __construct($name, $value = null, $namespaceURI = null) {
parent::__construct($name, null, $namespaceURI);
}
}
class XDOMDocument extends DOMDocument {
function __construct($version = null, $encoding = null) {
parent::__construct($version, $encoding);
$this->registerNodeClass('DOMElement', 'XDOMElement');
}
function createElement($name, $value = null, $namespaceURI = null) {
$element = new XDOMElement($name, $value, $namespaceURI);
$element = $this->importNode($element);
if (!empty($value)) {
$element->appendChild(new DOMText($value));
}
return $element;
}
}
$doc1 = new XDOMDocument();
$doc1_e1 = $doc1->createElement('foo', 'bar & baz');
$doc1->appendChild($doc1_e1);
echo $doc1->saveXML();
$doc2 = new XDOMDocument();
$doc2_e1 = $doc2->createElement('foo');
$doc2->appendChild($doc2_e1);
$doc2_e1->appendChild($doc2->createTextNode('bar & baz'));
echo $doc2->saveXML();
?>
Text specified in createElement:
<?xml version=""?>
<foo>bar & baz</foo>
Text added via createTextNode:
<?xml version=""?>
<foo>bar & baz</foo>
sergsokolenko at gmail dot com
30-Jan-2007 09:11
30-Jan-2007 09:11
To avoid warning message "unterminated entity reference" you may use htmlentities() for escaping supplied value:
<?php
//...
$dom->createElement('name', htmlentities($text))
//...
?>
