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

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

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

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

PHP

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

Q&A

解決済

2回答

1780閲覧

PHP XMLにattributeが1個の場合と複数ある場合のsimplexml_load_fileで取得する件について

trip

総合スコア14

XML

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

PHP

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

1グッド

0クリップ

投稿2022/02/17 07:21

下記のようなattributeが複数個ある場合(Groupが複数個ある場合)のxmlファイルの場合、

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<XmlDatas> 3 <Group No="1"> 4 <ID>1001</ID> 5 <Date>20210306</Date> 6 <Name>あいうえお</Name> 7 </Group> 8 <Group No="2"> 9 <ID>1002</ID> 10 <Date>20210306</Date> 11 <Name>かきくけこ</Name> 12 </Group> 13</XmlDatas>

simplexml_load_fileでSimpleXMLElement型に変換をすると、下記のような結果となります。
Groupの中に2つの要素からなる配列となり、その中にデータの連想配列のような形で入りました。

object(SimpleXMLElement)#1 (1) { ["Group"]=> array(2) { [0]=> object(SimpleXMLElement)#2 (4) { ["@attributes"]=> array(1) { ["No"]=> string(1) "1" } ["ID"]=> string(4) "1001" ["Date"]=> string(8) "20210306" ["Name"]=> string(15) "あいうえお" } [1]=> object(SimpleXMLElement)#3 (4) { ["@attributes"]=> array(1) { ["No"]=> string(1) "2" } ["ID"]=> string(4) "1002" ["Date"]=> string(8) "20210306" ["Name"]=> string(15) "かきくけこ" } } }

ただ、下記のようなattributeが1個の場合(Groupが1個の場合)のxmlファイルの場合、

XML

1<?xml version="1.0" encoding="UTF-8"?> 2<XmlDatas> 3 <Group No="1"> 4 <ID>1001</ID> 5 <Date>20210306</Date> 6 <Name>あいうえお</Name> 7 </Group> 8</XmlDatas>

simplexml_load_fileでSimpleXMLElement型に変換をすると、下記のような結果となり、
Groupの中にデータの連想配列がそのまま入るような形となりました。

object(SimpleXMLElement)#1 (1) { ["Group"]=> object(SimpleXMLElement)#2 (4) { ["@attributes"]=> array(1) { ["No"]=> string(1) "1" } ["ID"]=> string(4) "1001" ["Date"]=> string(8) "20210306" ["Name"]=> string(15) "あいうえお" } }

これを、下記のようにGroupが複数個ある場合のような結果とするにはどのような対応をすればいいかで困ってます。

object(SimpleXMLElement)#1 (1) { ["Group"]=> array(1) { [0]=> object(SimpleXMLElement)#2 (4) { ["@attributes"]=> array(1) { ["No"]=> string(1) "1" } ["ID"]=> string(4) "1001" ["Date"]=> string(8) "20210306" ["Name"]=> string(15) "あいうえお" } } }

ご教授いただければと思います。

tanat👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

かなり昔に同じ問題で困った時は

PHPのsimplexml_load_file()でXMLを扱うときに注意すること
と同様に、

  • 一旦配列に展開した後に詰めなおす

もしくは

  • 他のXMLパーサーを使う(うろ覚え。当時はサードパーティ製のXML関連ライブラリも開発が活発だった)
  • 配列を使う側で気を付ける(要素が配列であるか否かをチェックして処理を分岐させる)

しか方法が無かった(当時はそこまで調べられなかった)覚えがあります。


今対応するなら、
simplexml_load_fileの第二引数でクラスを指定して、そのクラスの中で解決を試みると思います。(実際にうまくいくかはやってみないと分からないです)

投稿2022/02/17 14:27

tanat

総合スコア18709

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

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

trip

2022/02/22 07:59

上記対応で解決できそうです。 ありがとうございました!
guest

0

php

1<?php 2 3$xml_string = <<<EOT 4<?xml version="1.0" encoding="UTF-8"?> 5<XmlDatas> 6 <Group No="1"> 7 <ID>1001</ID> 8 <Date>20210306</Date> 9 <Name>あいうえお</Name> 10 </Group> 11 <Group No="2"> 12 <ID>1002</ID> 13 <Date>20210306</Date> 14 <Name>かきくけこ</Name> 15 </Group> 16</XmlDatas> 17EOT; 18$xml = simplexml_load_string($xml_string); 19// var_export($xml); 20foreach ($xml as $group) { 21 echo 'No ' . $group->attributes()['No'] . PHP_EOL; 22 echo 'ID ' . $group->ID . PHP_EOL; 23 echo 'Date ' . $group->Date . PHP_EOL; 24 echo 'Name ' . $group->Name . PHP_EOL; 25 echo '--------' . PHP_EOL; 26}

結果:

No 1
ID 1001
Date 20210306
Name あいうえお

No 2
ID 1002
Date 20210306
Name かきくけこ

投稿2022/02/17 07:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問