SimpleXMLから@attributeにアクセスする


120

@attributeSimpleXMLオブジェクトのセクションへのアクセスに問題があります。I場合はvar_dumpオブジェクト全体、私は正しい出力を取得し、ときに私var_dumpのオブジェクト(ネストされたタグ)の残り、私は正しい出力を得るが、私はドキュメントに従うとするときvar_dump $xml->OFFICE->{'@attributes'}、私はその事実にもかかわらず、空のオブジェクトを取得します1つ目var_dumpは、出力する属性があることを明確に示しています。

誰もが私がここで間違っていることを知っています/どのように私はこの仕事をすることができますか?


5
SimpleXMLに関しては、var_dump()は誤解を招く可能性があります。出力を文字どおりに受け取らないでください。また、配列アクセスを使用して属性にアクセスできませんか?例:$ xml-> OFFICE ['MyAttribute']?
フランクファーマー、

['@attributes']を使用する場合は、最初にSimpleXMLElementを配列にキャストする必要があります
Enrique

回答:


88

XMLノードでattributes()関数を呼び出すことにより、XML要素の属性を取得できます。その後、関数の戻り値をvar_dumpできます。

php.netの詳細情報 http://php.net/simplexmlelement.attributes

そのページのサンプルコード:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}

7
興味深いことに、$bとなりますSimpleXMLElementので、対象print_rvar_dumpあなたに奇妙なものを提供します。これを回避するために文字列(または好きなもの)としてキャストできます。
jxmallett 2014

""。$ bを実行して文字列として保持します
dr_rk

135

これを試して

$xml->attributes()->Token


45
はい、ただし難しい形式です
zysoft 2012

2
はい、これは最もエレガントなソリューションです。
クリスチャン

私はこれを試しましたが、ページがクラッシュしていると思います。以下のボラは、これは間違ったフォーマットだと思っているようです。現時点では同意します。しかし、この(あなたの)フォーマットが何度も言及されているのを見ました。私が見逃しているニュアンスはありますか?
Gerard ONeill、2015年

2
@GerardONeill、ボラが属性にアクセスする方法が間違っていると言っている理由がわかりません。かなり完璧に機能します。欠けているのはattributes()、XMLの適切なタグに対応するオブジェクトを呼び出す必要があることです。あなたが持っている場合と同様に、それにアクセス<root><tag attr="a">b</tag></root>する必要があり$xml->tag->attributes()->attrます。
zysoft 2015

55

以前@attributesは以下のようになるために何度も使っていましたが、少し長くなりました。

$att = $xml->attributes();
echo $att['field'];

それはより簡単で、フォーマットに従った属性を一度にしか取得できません:

標準的な方法-配列アクセス属性(AAA)

$xml['field'];

他の選択肢は次のとおりです。

正しいクイックフォーマット

$xml->attributes()->{'field'};

間違ったフォーマット

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];

1
ページクラッシュが発生するため、間違った形式の最初のものに同意します。ただし、複数の人がこの動作を主張しています。これについての説明やニュアンスはありますか?
Gerard ONeill、2015年

1
「間違ったフォーマット」は機能します。私はいつも最初の例を使います。なぜそれが間違っているのですか?
Grzegorz 2015

3
技術的に$xml->attributes()->{'field'}は、、、$xml->attributes()->fieldおよび$f='field'; $xml->attributes()->$f;は同じです。1つが正しい形式で、もう1つが間違っている理由はありません。
zysoft

$ xml-> attributes()-> {'field'}は、属性名に特殊文字を使用しても安全であるため(つまり、 "data-attr")、正しいです。$ xml-> attributes()-> fieldは、単一の英数字の単語である属性に対してのみ機能します
vzr

両方の正しいオプションを使用するときにSimpleXMLElementを取得する。
Darius.V 2018

41
$xml = <<<XML
<root>
<elem attrib="value" />
</root>
XML;

$sxml = simplexml_load_string($xml);
$attrs = $sxml->elem->attributes();
echo $attrs["attrib"]; //or just $sxml->elem["attrib"]

を使用しSimpleXMLElement::attributesます。

真実は、SimpleXMLElement get_propertiesハンドラーは大きな時間を費やすことです。「@attributes」という名前のプロパティがないため、実行できません$sxml->elem->{"@attributes"}["attrib"]


SimpleXMLがこの奇妙な方法(ハンドラー)で動作する理由を説明していただきありがとうございget_propertiesます。とても興味深い。
andrewtweber 14

値の代わりにこれを行うときにSimpleXMLElementを取得する
Darius.V



3

simplexml_load_file($ file)の結果をJSON構造に変換してデコードし直すのに役立ちました。

$xml = simplexml_load_file("$token.xml");
$json = json_encode($xml);
$xml_fixed = json_decode($json);

$try1 = $xml->structure->{"@attributes"}['value'];
print_r($try1);

>> result: SimpleXMLElement Object
(
)

$try2 = $xml_fixed->structure->{"@attributes"}['value'];
print_r($try2);

>> result: stdClass Object
(
    [key] => value
)

2

残念ながら、PHP 5.5のユニークなビルド(現時点ではGentooで動かなくなっています)があります。

 $xml->tagName['attribute']

機能した唯一のソリューションでした。「Right&Quick」フォーマットを含む上記のBoraのメソッドをすべて試しましたが、すべて失敗しました。

これが最も簡単なフォーマットであるという事実はプラスですが、私が他の人が機能していると言っていたすべてのフォーマットを試してみて、正気を失っているとは思いませんでした。

Njoyはその価値があります(ユニークなビルドについて言及しましたか?)。


私は通常、その要素の要素の同じ名前空間にある属性の属性には配列表記を使用することをお勧めします。理由から、それは(あなたが造ったように)最も簡単なフォーマットだと思います。名前付きのキーを持つarray-access = simplexml要素を持つ属性。
2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.