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

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

ただいまの
回答率

90.62%

  • PHP

    19892questions

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

  • XML

    646questions

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

  • XMLパーサ

    37questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 408

quinty

score 5

前提・実現したいこと

PHPのDOMにノードを追加して出力したい

発生している問題・エラーメッセージ

正しいXMLが出力されない。
問題の該当部分→  <<abc><poly> test 1</poly></abc>/>
期待した結果→ <abc><poly> test 1</poly></abc>

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <folders>
    <folder>
      <<abc><poly> test 1</poly></abc>/>
    </folder>
    <folder>
      <<abc><poly> test 2</poly></abc>/>
    </folder>
    <folder>
      <<abc><poly> test 3</poly></abc>/>
    </folder>
    <folder>
      <<abc><poly> test 4</poly></abc>/>
    </folder>
  </folders>
</root>

該当のソースコード

<?php

$root = '<?xml version="1.0" encoding="UTF-8" ?><root></root>';
//XML作成開始
$sxml = new SimpleXMLElement($root);
$folders = $sxml->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>");

foreach($xml_arr as $xml) {
    $aa = $folders->addChild('folder');
      $aa->addChild( $xml);
}

//ownerDocumentはノードが含まれるトップレベルのドキュメントオブジェクトを返す
$dom = dom_import_simplexml($sxml)->ownerDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
echo $dom->saveXML();

exit;
?>

試したこと

textnodeで挿入してみても文字コード化してしまう。

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

php5

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

$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>");

foreach($xml_arr as $xml) {
  $aa = $folders->addChild('folder');
      $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/18 01:10

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

    キャンセル

check解決した方法

+1

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

<?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();

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

<?php

$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>");

$strXML = '<?xml version="1.0" encoding="UTF-8" ?><root>'.'<folders>'.implode($xml_arr).'</folders></root>';

$sxml = new SimpleXMLElement($strXML);

//ownerDocumentはノードが含まれるトップレベルのドキュメントオブジェクトを返す
$dom = dom_import_simplexml($sxml)->ownerDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
echo $dom->saveXML();

exit;
?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 11:41

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

    キャンセル

0

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

<?php

$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>");

$strXML = '<?xml version="1.0" encoding="UTF-8" ?><root>'.'<folders>'.implode($xml_arr).'</folders></root>';
$strXML2 = str_replace("<abc>","<folder><abc>",$strXML);
$strXML2 = str_replace("</abc>","</abc></folder>",$strXML2);

$sxml = new SimpleXMLElement($strXML2);

//ownerDocumentはノードが含まれるトップレベルのドキュメントオブジェクトを返す
$dom = dom_import_simplexml($sxml)->ownerDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
echo $dom->saveXML();

exit;
?>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/23 06:27

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

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    phpで特定classの範囲だけを読み込ませたいです

    このように書くと、「nakami.php」の『中身が全部』出力されるじゃないですか。 <?php require('nakami.php'); ?> これを、 『中身が全部』で

  • 解決済

    PHPでXMLファイル書き換え

    PHPでXMLファイルを書き換えたいのですが、参考になりそうな資料は処理が多く、もっと単純に解決できないものかと思い質問させていただきます 処理としては 存在するxmlファ

  • 解決済

    SimpleXMLElementでsitemap.xmlを更新したい。

    PHPで sitemap.xml を更新したいのですが、エラーが出て出来ません。 $xmlElement = new SimpleXMLElement('<xml versio

  • 解決済

    メニューの重複しているものを表示させないようにするには?

    phpで入力した内容が入っているxmlから項目の一つを取り出し、セレクトボックスで表示させているのですが、 重複している項目を表示させないまたは重複していない項目のみを表示させ

  • 解決済

    xmlデータの検索と構造解析にxsltを使おうとしたのですが…

    前提・実現したいこと 非常に複雑な構造をもったXMLファイルから必要なデータを抜き出して利用したいと思っています。 しかし、データ構造などに関する充分な資料がなく、目当てのデータが

  • 解決済

    CakePHPをAzure WebAPPで使う方法

    CakePHPをAzure WebAPPで使う方法を探しています。 以下のコマンドで作成されるCakePHPのプロジェクトファイル一式をAzure WebAPP(PHP)のルー

  • 受付中

    php間のhttpリクエスト方法

    htmlから既存phpにGETでデータを送信するphpを作りたい。 http:〜〜〜?○○=○○&○○=○○の形になるんでしょうか。 同時に、既存phpの中で最終的に結果をecho

  • 解決済

    sitemap.xmlの書きだし方変更

     前提・実現したいこと sitemap.xmlの仕様変更で<priority>,<changefreq>項目の追加のしかた。  発生している問題・エラーメッセージ sitema

同じタグがついた質問を見る

  • PHP

    19892questions

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

  • XML

    646questions

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

  • XMLパーサ

    37questions

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