Використання SimpleXML для створення XML-об’єкта з нуля


77

Чи можна використовувати функції PHP SimpleXML для створення XML-об'єкта з нуля? Переглядаючи список функцій, є способи імпортувати існуючий рядок XML в об’єкт, яким потім можна маніпулювати, але якщо я просто хочу генерувати об’єкт XML програмно з нуля, який найкращий спосіб це зробити?

Я зрозумів, що ви можете використовувати simplexml_load_string () і передати потрібний кореневий рядок, і тоді у вас є об’єкт, яким ви можете маніпулювати, додаючи дочірні елементи ... хоча це здається свого роду хакерством, оскільки мені доводиться насправді жорстко закодуйте якийсь XML у рядок, перш ніж його можна буде завантажити.

Я зробив це, використовуючи функції DOMDocument , хоча це трохи заплутано, бо я не впевнений, що DOM має робити зі створенням чистого XML-документа ... так що, можливо, він просто погано названий :-)

Відповіді:


144

Звичайно, ви можете. Напр.

<?php
$newsXML = new SimpleXMLElement("<news></news>");
$newsXML->addAttribute('newsPagePrefix', 'value goes here');
$newsIntro = $newsXML->addChild('content');
$newsIntro->addAttribute('type', 'latest');
Header('Content-type: text/xml');
echo $newsXML->asXML();
?>

Вихідні дані

<?xml version="1.0"?>
<news newsPagePrefix="value goes here">
    <content type="latest"/>
</news>

Веселіться.


Між цим та відповідями @ Stefan і @ PhiLho це здається найбільш простим і зрозумілим. Водночас мені цікаво, чи не відрізняється продуктивність. Два інших пахнуть швидким кодом.
Каміло Мартін

2
Як зберегти це як файл XML на сервері? зробити його доступним для мого коду ActionScript?
shababhsiddique

@dreamwerx Можливо, мені щось не вистачає, чому ваш contentтег не закритий </content>?
Shackrock

1
@Shackrock: він закритий, подивіться на "/" перед ">" у <content type = "latest" />
Мішель

4
Як додати текст між тегами вмісту. Скажіть <вміст> Вау, це працює! </content>
harishannam

21

У PHP5 замість цього слід використовувати клас об’єктної моделі документа . Приклад:

$domDoc = new DOMDocument;
$rootElt = $domDoc->createElement('root');
$rootNode = $domDoc->appendChild($rootElt);

$subElt = $domDoc->createElement('foo');
$attr = $domDoc->createAttribute('ah');
$attrVal = $domDoc->createTextNode('OK');
$attr->appendChild($attrVal);
$subElt->appendChild($attr);
$subNode = $rootNode->appendChild($subElt);

$textNode = $domDoc->createTextNode('Wow, it works!');
$subNode->appendChild($textNode);

echo htmlentities($domDoc->saveXML());

1
DOM API такий багатослівний! Я хотів би мати можливість зробити щось на зразок $elem->append($doc->p('This is a paragraph')); Навіть додавання тексту - це клопіт із двох рядків. Я хотів би щось на зразок$elem->append('Some text');
thomasrutter

2
На мій погляд, це багато в чому залежить від того, що ви плануєте робити. Якщо ви хочете базову та швидку функціональність, SimpleXML ідеально підходить! Але в будь-якому випадку: питання було "Використання SimpleXML для створення XML-об’єкта з нуля" - так не по темі, вибачте.
Stephan Weinhold

16

Будь ласка, дивіться мою відповідь тут . Як зазначає dreamwerx.myopenid.com , це можна зробити за допомогою SimpleXML , але розширення DOM було б кращим та гнучкішим способом. Крім того, є третій спосіб: використання XMLWriter . Він набагато простіший у використанні, ніж DOM, і тому це мій найкращий спосіб писати XML-документи з нуля.

$w=new XMLWriter();
$w->openMemory();
$w->startDocument('1.0','UTF-8');
$w->startElement("root");
    $w->writeAttribute("ah", "OK");
    $w->text('Wow, it works!');
$w->endElement();
echo htmlentities($w->outputMemory(true));

До речі: DOM розшифровується як D ocument O bject M odel; це стандартизований API в XML-документах.


XMLwriter - це добре, якщо ви збираєтеся виводити дані безпосередньо в код XML без будь-яких маніпуляцій. Подальші маніпуляції (переміщення елементів навколо, вставка елементів) насправді неможливі.
thomasrutter

Оновлені посилання (я думаю) php.net/manual/en/intro.xmlwriter.php , php.net/manual/en/book.dom.php
chris85
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.