質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

396閲覧

PHPのDOMにノードを追加したいが正しいXMLが出力されない

quinty

総合スコア17

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

XMLパーサ

XML文書のテキストデータだけを抜き出して、アプリケーションソフトが利用しやすい形式に変換させるソフトウェアをXMLパーサと呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/09/17 15:29

###前提・実現したいこと
PHPのDOMにノードを追加して出力したい

###発生している問題・エラーメッセージ
正しいXMLが出力されない。
問題の該当部分→ <<abc><poly> test 1</poly></abc>/>
期待した結果→ <abc><poly> test 1</poly></abc>

XML

1<?xml version="1.0" encoding="UTF-8"?> 2<root> 3 <folders> 4 <folder> 5 <<abc><poly> test 1</poly></abc>/> 6 </folder> 7 <folder> 8 <<abc><poly> test 2</poly></abc>/> 9 </folder> 10 <folder> 11 <<abc><poly> test 3</poly></abc>/> 12 </folder> 13 <folder> 14 <<abc><poly> test 4</poly></abc>/> 15 </folder> 16 </folders> 17</root> 18

###該当のソースコード

PHP

1 2<?php 3 4$root = '<?xml version="1.0" encoding="UTF-8" ?><root></root>'; 5//XML作成開始 6$sxml = new SimpleXMLElement($root); 7$folders = $sxml->addChild('folders'); 8 9$xml_arr=array( 10 "<abc><poly> test 1</poly></abc>" ,"<abc><poly> test 2</poly></abc>" 11 ,"<abc><poly> test 3</poly></abc>" ,"<abc><poly> test 4</poly></abc>"); 12 13foreach($xml_arr as $xml) { 14 $aa = $folders->addChild('folder'); 15 $aa->addChild( $xml); 16} 17 18//ownerDocumentはノードが含まれるトップレベルのドキュメントオブジェクトを返す 19$dom = dom_import_simplexml($sxml)->ownerDocument; 20$dom->preserveWhiteSpace = false; 21$dom->formatOutput = true; 22echo $dom->saveXML(); 23 24exit; 25?> 26

###試したこと
textnodeで挿入してみても文字コード化してしまう。

###補足情報(言語/FW/ツール等のバージョンなど)
php5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

php

1$xml_arr=array( 2 "<abc><poly> test 1</poly></abc>" ,"<abc><poly> test 2</poly></abc>" 3 ,"<abc><poly> test 3</poly></abc>" ,"<abc><poly> test 4</poly></abc>"); 4 5foreach($xml_arr as $xml) { 6 $aa = $folders->addChild('folder'); 7 $aa->addChild( $xml);

$txt_arr=array( " test 1" ," test 2" ," test 3" ," test 4"); foreach($txt_arr as $txt) { $aa = $folders->addChild('folder'); $bb = $aa->addChild('abc'); $cc = $bb->addChild('pory'); $cc->addChild($text);

でできるのではないでしょうか。

投稿2017/09/17 15:45

編集2017/09/18 01:48
seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quinty

2017/09/17 16:10

ご回答ありがとうございます! $xml_arrの中身部分が動かせない場合は、何か方法がありますでしょうか?
guest

0

自己解決

こんな感じでイケました。もっと無駄なくエレガントにできればいいんですが…。

<?php $root_str = '<?xml version="1.0" encoding="UTF-8" ?><root></root>'; //XML作成開始 $sxml1 = new SimpleXMLElement($root_str); $folders = $sxml1->addChild('folders'); $xml_arr=array( "<abc><poly>test 1</poly></abc>" ,"<abc><poly> test 2</poly></abc>" ,"<abc><poly> test 3</poly></abc>" ,"<abc><poly> test 4</poly></abc>"); $sxml2=simplexml_load_string('<dummy>'.implode($xml_arr).'</dummy>');//無駄だけど仕方ない if( !$sxml2 ) { echo '失敗' ; } foreach($sxml2->xpath('//poly') as $poly) { $folder = $folders->addChild('folder'); $abc->addChild('poly',$poly); } //echo $sxml1->saveXML(); // //ownerDocumentはノードが含まれるトップレベルのドキュメントオブジェクトを返す $dom = dom_import_simplexml($sxml1)->ownerDocument; $dom->preserveWhiteSpace = false; $dom->formatOutput = true; echo $dom->saveXML();

投稿2017/09/18 02:47

編集2017/09/18 05:37
quinty

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベタにすべて文字列として並べて、SimpleXMLElementオブジェクトにしてみました。
Cloud9で検証済みです。

php

1<?php 2 3$xml_arr=array( 4 "<abc><poly> test 1</poly></abc>" ,"<abc><poly> test 2</poly></abc>" 5 ,"<abc><poly> test 3</poly></abc>" ,"<abc><poly> test 4</poly></abc>"); 6 7$strXML = '<?xml version="1.0" encoding="UTF-8" ?><root>'.'<folders>'.implode($xml_arr).'</folders></root>'; 8 9$sxml = new SimpleXMLElement($strXML); 10 11//ownerDocumentはノードが含まれるトップレベルのドキュメントオブジェクトを返す 12$dom = dom_import_simplexml($sxml)->ownerDocument; 13$dom->preserveWhiteSpace = false; 14$dom->formatOutput = true; 15echo $dom->saveXML(); 16 17exit; 18?>

投稿2017/09/18 02:08

seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quinty

2017/09/18 02:41

再度のご回答ありがとうございます! こちらの指定ミスで申し訳ありません。 <folders>の下、<abc>の上にそれぞれ<folder>に追加したいのです。 ですがseastar3様のおかげでいい感じのが思いつきました。
guest

0

<folder>ノードを見落としていました。申し訳ありません。
str_replace関数を使って、あくまでテキスト処理で片付けたのが以下のコードです。

php

1<?php 2 3$xml_arr=array( 4 "<abc><poly> test 1</poly></abc>" ,"<abc><poly> test 2</poly></abc>" 5 ,"<abc><poly> test 3</poly></abc>" ,"<abc><poly> test 4</poly></abc>"); 6 7$strXML = '<?xml version="1.0" encoding="UTF-8" ?><root>'.'<folders>'.implode($xml_arr).'</folders></root>'; 8$strXML2 = str_replace("<abc>","<folder><abc>",$strXML); 9$strXML2 = str_replace("</abc>","</abc></folder>",$strXML2); 10 11$sxml = new SimpleXMLElement($strXML2); 12 13//ownerDocumentはノードが含まれるトップレベルのドキュメントオブジェクトを返す 14$dom = dom_import_simplexml($sxml)->ownerDocument; 15$dom->preserveWhiteSpace = false; 16$dom->formatOutput = true; 17echo $dom->saveXML(); 18 19exit; 20?>

投稿2017/09/21 10:29

seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quinty

2017/09/22 21:27

ありがとうございます!str_replaceは好きになれそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問