PHPを使用してXMLファイルを動的に生成する方法


233

実行時に動的にxmlファイルを生成する必要があります。PHPを使用して動的に以下のXMLファイルを生成するのを手伝ってください。

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <track>
     <path>song1.mp3</path>
     <title>Track 1 - Track Title</title>
 </track>
 <track>
     <path>song2.mp3</path>
     <title>Track 2 - Track Title</title>
 </track>
 <track>
     <path>song3.mp3</path>
     <title>Track 3 - Track Title</title>
 </track>
 <track>
     <path>song4.mp3</path>
     <title>Track 4 - Track Title</title>
 </track>
 <track>
     <path>song5.mp3</path>
     <title>Track 5 - Track Title</title>
 </track>
 <track>
     <path>song6.mp3</path>
     <title>Track 6 - Track Title</title>
 </track>
 <track>
     <path>song7.mp3</path>
     <title>Track 7 - Track Title</title>
 </track>
 <track>
     <path>song8.mp3</path>
     <title>Track 8 - Track Title</title>
 </track>


1
また、xml 1.0はすべての検索エンジンでサポートされているわけではありません。最も知られているxmlバージョンであるため、xml 0.9をお勧めします。
Domuta Marcel 2013

PHPとMySQLを使用してXMLファイルを生成する-kvcodes.com/2017/03/generate-xml-file-using-php-mysql
Kvvaradha

1
@Kvvaradhaそれは良い解決策ではありません
robertmain

回答:


358

SimpleXMLElementを使用します。

<?php

$xml = new SimpleXMLElement('<xml/>');

for ($i = 1; $i <= 8; ++$i) {
    $track = $xml->addChild('track');
    $track->addChild('path', "song$i.mp3");
    $track->addChild('title', "Track $i - Track Title");
}

Header('Content-type: text/xml');
print($xml->asXML());

12
SimpleXmlでエンコーディングを指定することは可能ですか?どうすればできますか?
エイネキ2009年

1
こんにちは、私はあなたの例を試しましたが、検証で2つの警告が表示されます。 validator.w3.org/...
サティヤ

3
@Einekiは<?xml version="1.0" encoding="WHATEVER_IT_IS"?>処理命令を追加するだけです。SimpleXMLElementは正しいことを行うと思います。クエリされたすべての文字列値をmb_internal_encodingに変換します。
Ivan Krechetov 2013年

33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang 2013

「行6の列6のエラー:ドキュメントの先頭でのみ許可されたXML宣言」が表示されます。コードにより、XMLの先頭に余分な空行が追加され、解析エラーが発生します。
Elia Weiss

179

PHPでXMLdocumentを作成するには、DOMDocumentクラスをインスタンス化し、子ノードを作成して、これらのノードをドキュメントツリーの正しいブランチに追加する必要があります。

参考のために、http://it.php.net/manual/en/book.dom.phpを読むことができます

次に、以下のコードのクイックツアーを行います。

  • 2行目で空のxmlドキュメントを作成します(xmlバージョン(1.0)とエンコーディング(utf8)を指定するだけです)
  • ここで、xmlツリーを設定する必要があります。
    • xmlnodeを作成する必要があります(5行目)
    • これを正しい位置に追加する必要があります。ルートを作成しているので、これをdomdocumentに直接追加します。
    • create要素が要素をノードに追加し、挿入されたノードを返すことに注意してください。この参照を保存して、トラックノードをルートノード(別名xml)に追加します。

これらは基本であり、ノードを1行で(たとえば13番目に)作成して追加できます。domapiを使用すると、他の多くのことを実行できます。それはあなた次第です。

<?php    
    /* create a dom document with encoding utf8 */
    $domtree = new DOMDocument('1.0', 'UTF-8');

    /* create the root element of the xml tree */
    $xmlRoot = $domtree->createElement("xml");
    /* append it to the document created */
    $xmlRoot = $domtree->appendChild($xmlRoot);

    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);

    /* you should enclose the following two lines in a cicle */
    $currentTrack->appendChild($domtree->createElement('path','song1.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song1.mp3'));

    $currentTrack->appendChild($domtree->createElement('path','song2.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song2.mp3'));

    /* get the xml printed */
    echo $domtree->saveXML();
?>

編集:もう1つのヒント:xmlを出力する代わりにxmldocument(domドキュメント1またはsimplexml 1)を使用する主な利点は、xmltreeがxpathクエリで検索できることです。


6
もう一度使用できます$domtree->save('mypath/xmlfile.xml');か?
ギタリスト

1
@guitarlassその通りです。savesaveXMLは似ています。最初はxmltreeをファイルにダンプし、2番目は文字列にダンプします(次の手順で通常のファイル保存ディレクティブを使用して保存できます)。
エイネキ

4
@jjonesdesign怠惰になるために必要な知識を得るためには、一生懸命努力する必要があります:)
Eineki

1
例では、XML要素で分割する代わりに、長い1行を生成します。$domtree->formatOutput = true;出力をきれいにするために追加する必要があります:)
JackTheKnife

1
@Drenylは適切なcontent-typeヘッダーとa Content-Disposition: attachmentを追加し、saveXml結果を出力します。ファイル名を提案することもできます。
Eineki

27

これを行う簡単な方法は次のとおりです。

<?php
// Send the headers
header('Content-type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

echo '<xml>';

// echo some dynamically generated content here
/*
<track>
    <path>song_path</path>
    <title>track_number - track_title</title>
</track>
*/

echo '</xml>';

?>

.phpとして保存します


18
簡単ですが、山かっこやアンパサンドなどのXMLメタ文字が変数に挿入されているとエラーが発生しやすい
Matthew Lock

15

ではFluidXMLあなたは非常にイースリーあなたのXMLを生成することができます。

$tracks = fluidxml('xml');

$tracks->times(8, function ($i) {
    $this->add([
        'track' => [
            'path'  => "song{$i}.mp3",
            'title' => "Track {$i} - Track Title"
        ]
    ]);

});

https://github.com/servo-php/fluidxml


2
前のリリースのFluidXMLはPHP 5をサポートしています
Daniele Orlando

4
SimpleXMLを使用してネイティブPHPで簡単に実行できることを行う外部ライブラリは、ソリューションではありません。
robertmain

4

見てみましょうタイニーしかし強いですテンプレートシステムを。これは通常、HTMLのテンプレート化に使用されますが、XMLファイルで機能する拡張機能があります。1つのコードファイルと2つのテンプレートファイル(htmとxml)を作成できるレポートを作成するためにこれを幅広く使用し、ユーザーはレポートを画面またはスプレッドシートのどちらに送信するかを選択できます。

もう1つの利点は、XMLを最初からコーディングする必要がないことです。場合によっては、非常に大きな複雑なスプレッドシートをエクスポートしたい場合があり、必要なすべてのエクスポートをコーディングする代わりに、既存のスプレッドシートをデータ出力が必要な場合は、xmlとコードタグで置き換えます。これは、作業を迅速かつ効率的に行う方法です。


-14
$query=mysql_query("select * from tablename")or die(mysql_error()); 
$xml="<libraray>\n\t\t";
while($data=mysql_fetch_array($query))
{

    $xml .="<mail_address>\n\t\t";
    $xml .= "<id>".$data['id']."</id>\n\t\t";
    $xml .= "<email>".$data['email_address']."</email>\n\t\t";
    $xml .= "<verify_code>".$data['verify']."</verify_code>\n\t\t";
    $xml .= "<status>".$data['status']."</status>\n\t\t";
    $xml.="</mail_address>\n\t";
}
$xml.="</libraray>\n\r";
$xmlobj=new SimpleXMLElement($xml);
$xmlobj->asXML("text.xml");

データベースに接続するだけで、プロジェクトフォルダにtest.xmlファイルが作成されます。


26
これは、本番環境で表示されるべきではない種類のコードです。出力するデータによっては、無効な(つまり、解析できない)XMLを作成する場合があります。せいぜいずさんなだけで、数行のコードを保存できるので簡単に見えるかもしれませんが、メンテナンスとデバッグの点で後でコストがかかります。いつかあなたの仕事の責任を引き継ぐかもしれない貧しい人は言うまでもありません。
Arne

3
-1最初に文字列をいくつかのwanna-be-xmlと連結し、次にその文字列をSimpleXMLにプッシュします-これは上下逆になっています。代わりに、まず XMLライブラリオブジェクトを初期化してから、それを使用してXMLを構築します。より簡単で、メモリ使用量が少なく、エラーが発生しにくく、XMLをファイルまたは標準出力にストリーミングすることができます。
hakre 2014

2
多分それはこの答えを削除する時です(そしてあなたはあなたの失われた評判を取り戻すでしょう!)。
ホセマヌエルアバルカロドリゲス

留まるべきだと思います。初めてXMLで作業するときに自分でコードを作成しましたが、これは少しこのように見えたので、何をすべきでないかを確認することは非常に役に立ちました。
PeterHøjlundAndersen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.