SimpleXMLElement::addChild
(PHP 5 >= 5.1.3, PHP 7)
SimpleXMLElement::addChild — Добавляет дочерний элемент к узлу XML
Описание
$name
[, string $value
[, string $namespace
]] )Добавляет дочерний элемент к узлу и возвращает потомка SimpleXMLElement.
Список параметров
-
name
-
Имя добавляемого дочернего элемента.
-
value
-
Если указано, то значение (содержимое) дочернего элемента.
-
namespace
-
Если указано, то пространство имен, к которому принадлежит дочерний элемент.
Возвращаемые значения
Метод addChild возвращает объект SimpleXMLElement, представляющий добавленного потомка к узлу XML.
Примеры
Замечание:
Перечисленные примеры могут включать example.php, в котором определяется XML строка, расположенная в первом примере руководства по базовому использованию.
Пример #1 Добавление атрибутов и потомков к SimpleXML элементу
<?php
include 'example.php';
$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');
$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: Истории парсера');
$movie->addChild('plot', 'Все о людях, создававших его.');
$characters = $movie->addChild('characters');
$character = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');
$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');
echo $sxe->asXML();
?>
Результатом выполнения данного примера будет что-то подобное:
<?xml version="1.0" standalone="yes"?> <movies type="documentary"> <movie> <title>PHP: Появление Парсера</title> <characters> <character> <name>Ms. Coder</name> <actor>Onlivia Actora</actor> </character> <character> <name>Mr. Coder</name> <actor>El ActÓr</actor> </character> </characters> <plot> Таким образом, это язык. Это все равно язык программирования. Или это скриптовый язык? Все раскрывается в этом документальном фильме, похожем на фильм ужасов. </plot> <great-lines> <line>PHP решает все мои задачи в web</line> </great-lines> <rating type="thumbs">7</rating> <rating type="stars">5</rating> </movie> <movie> <title>PHP2: Истории парсера</title> <plot>Все о людях, создававших его.</plot> <characters> <character> <name>Mr. Parser</name> <actor>John Doe</actor> </character> </characters> <rating type="stars">5</rating> </movie> </movies>
Смотрите также
- SimpleXMLElement::addAttribute() - Добавляет атрибут к SimpleXML-элементу
- Базовое использование SimpleXML
- Функция SimpleXMLElement::addAttribute() - Добавляет атрибут к SimpleXML-элементу
- Функция SimpleXMLElement::addChild() - Добавляет дочерний элемент к узлу XML
- Функция SimpleXMLElement::asXML() - Возвращает сформированный XML документ в виде строки используя SimpleXML элемент
- Функция SimpleXMLElement::attributes() - Возвращает атрибуты элемента
- Функция SimpleXMLElement::children() - Поиск дочерних элементов данного узла
- Функция SimpleXMLElement::__construct() - Создание нового SimpleXMLElement объекта
- Функция SimpleXMLElement::count() - Считает количество дочерних элементов у текущего элемента
- Функция SimpleXMLElement::getDocNamespaces() - Возвращает объявленное пространство имен в документе
- Функция SimpleXMLElement::getName() - Получение имени XML элемента
- Функция SimpleXMLElement::getNamespaces() - Получение пространств имен, используемых в документе
- Функция SimpleXMLElement::registerXPathNamespace() - Создает префикс/пространство имен контекста для следующего XPath запроса
- Функция SimpleXMLElement::saveXML() - Псевдоним SimpleXMLElement::asXML
- Функция SimpleXMLElement::__toString() - Returns the string content
- Функция SimpleXMLElement::xpath() - Запускает XPath запрос к XML данным
Коментарии
Note that although addChild() escapes "<" and ">", it does not escape the ampersand "&".
So addChild() is unsuited to handle user-defined input!
Instead, you will have to replace all "&" with "&" before calling addChild().
Or, use htmlspecialchars() which also replaces other characters, but won't do any harm as addChild() won't replace those again.
Here is a class with more functions for SimpleXMLElement :
<?php
/**
*
* Extension for SimpleXMLElement
* @author Alexandre FERAUD
*
*/
class ExSimpleXMLElement extends SimpleXMLElement
{
/**
* Add CDATA text in a node
* @param string $cdata_text The CDATA value to add
*/
private function addCData($cdata_text)
{
$node= dom_import_simplexml($this);
$no = $node->ownerDocument;
$node->appendChild($no->createCDATASection($cdata_text));
}
/**
* Create a child with CDATA value
* @param string $name The name of the child element to add.
* @param string $cdata_text The CDATA value of the child element.
*/
public function addChildCData($name,$cdata_text)
{
$child = $this->addChild($name);
$child->addCData($cdata_text);
}
/**
* Add SimpleXMLElement code into a SimpleXMLElement
* @param SimpleXMLElement $append
*/
public function appendXML($append)
{
if ($append) {
if (strlen(trim((string) $append))==0) {
$xml = $this->addChild($append->getName());
foreach($append->children() as $child) {
$xml->appendXML($child);
}
} else {
$xml = $this->addChild($append->getName(), (string) $append);
}
foreach($append->attributes() as $n => $v) {
$xml->addAttribute($n, $v);
}
}
}
}
?>
To complete Volker Grabsch's comment, stating :
"Note that although addChild() escapes "<" and ">", it does not escape the ampersand "&"."
To work around that problem, you can use direct property assignment such as :
<?php
$xmlelement->value = 'my value < > &';
// results in <value>my value < > &</value>
?>
instead of doing :
<?php
$xmlelement->addChild('value', 'my value < > &');
// results in <value>my value < > &</value> (invalid XML)
?>
See also: http://stackoverflow.com/questions/552957 (Rationale behind SimpleXMLElement's handling of text values in addChild and addAttribute)
HTH
In the docs for google sitemaps it is required an element for mobile sitemaps that looks like this: <mobile:mobile/>
I used some time to figure out how to make it, but it is quite simple when understood.
$mobile_schema = 'http://www.google.com/schemas/sitemap-mobile/1.0';
//Create root element
$xml_mobile = new SimpleXMLElement('
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="'.$mobile_schema.'"></urlset>
');
//Add required children
$url_mobile = $xml_b_list_mobile->addChild('url');
$url_mobile->addChild('loc', 'your-mobile-site-url');
$url_mobile->addChild('mobile:mobile', null, $mobile_schema);
For this to work properly the attribute xmlns:mobile must be set in the root node, and then used as namespace(third argument) when creating the mobile:mobile child with null as value.
Want to continue the ampersand (&) chain problem.
Sometimes, you would want to assign (=) addChild.
This trick will helps you to do this.
<?php
$webOrders = new SimpleXMLElement('<?xml version="1.0"?><WebOrders></WebOrders>');
$webOrder = $webOrders->addChild('WebOrder');
$product = $webOrder->addChild('Product');
$product[0] = 'T&M';
$product->addAttribute('price', 19.99);
$product->addAttribute('qty', 2);
var_dump($webOrders->asXML());
?>
OUTPUT would be:
<?xml version="1.0" encoding="UTF-8"?>
<WebOrders>
<WebOrder>
<Product price="19.99" qty="2">T&M</Product>
</WebOrder>
</WebOrders>
The class below allows you to write CDATA and to add additional attributes.
<?php
class SimpleXMLElementExtended extends \SimpleXMLElement
{
public function addChildWithCData($name, $value)
{
$child = parent::addChild($name);
$element = dom_import_simplexml($child);
$docOwner = $element->ownerDocument;
$element->appendChild($docOwner->createCDATASection($value));
return $child;
}
}
?>
Example:
<?php
$xml = new SimpleXMLElementExtended('<xml></xml>');
$content = $xml->addChildWithCData('content', 'Title of the page');
$content->addAttribute('id', 1);
$content->addAttribute('enabled', 'true');
// Output:
// <xml>
// <content id="1" enabled="true"><![CDATA[Title of the page]]></content>
// </xml>
?>