web-dev-qa-db-ja.com

SimpleXMLを使用してゼロからXMLオブジェクトを作成する

PHPのSimpleXML関数を使用してゼロからXMLオブジェクトを作成することは可能ですか?関数リストに目を通すと、既存のXML文字列をオブジェクトにインポートしてから操作できるようになりますが、プログラムからXMLオブジェクトをゼロから生成したい場合、それを行う最善の方法は何ですか?

Simplexml_load_string()を使用して、必要なルート文字列を渡すことができることを理解しました。そして、子を追加することで操作できるオブジェクトを取得しました...これは一種のハックのように思えますが、ロードする前に、実際にXMLを文字列にハードコーディングします。

DOMDocument functions を使用して実行しましたが、DOMが純粋なXMLドキュメントを作成するために何をするのかわからないため、少し混乱しますが... -)

73
dirtside

もちろんできます。例えば。

<?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>

楽しんで。

135
DreamWerx

PHP5では、代わりに Document Object Model クラスを使用する必要があります。例:

$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());
21
PhiLho

私の答えをご覧ください こちらdreamwerx.myopenid.com が指摘しているように、 SimpleXML でこれを行うことができますが、 DOM拡張 の方がより柔軟で柔軟性があります仕方。さらに、3番目の方法があります: 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;これは、XMLドキュメントへの標準化されたAPIです。

16
Stefan Gehrig