web-dev-qa-db-ja.com

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

SimpleXMLオブジェクトの@attributeセクションへのアクセスに問題があります。オブジェクト全体をvar_dumpすると、正しい出力が得られ、オブジェクトの残りの部分(ネストしたタグ)をvar_dumpとすると、正しい出力が得られますが、ドキュメントとvar_dump$xml->OFFICE->{'@attributes'}、最初のvar_dumpが出力する属性があることを明確に示しているにもかかわらず、空のオブジェクトを取得します。

ここで私が間違っていること/誰がこの仕事をすることができるか知っていますか?

106
benjy

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";
}
82
Niels Bom

これを試して

$xml->attributes()->Token
123
zysoft

以下のように@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'];
48
Bora
$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"]を実行できません。

38
Artefacto

あなたはただすることができます:

echo $xml['token'];
15
Alix Axel

これらの属性のリストを探している場合は、XPathがあなたの友達になります

print_r($xml->xpath('@token'));
7
Cory Collier

残念ながら、私はPHP 5.5のユニークなビルド(現時点ではGentooにこだわっています)を持っています。

 $xml->tagName['attribute']

働いた唯一のソリューションでした。 「Right&Quick」形式を含め、上記のBoraのすべての方法を試しましたが、すべて失敗しました。

これが最も簡単な形式であるという事実はプラスですが、他の人が機能していると言っているすべての形式を試してみるのは正気ではありませんでした。

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

2
Gerard ONeill

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
)
1
t2m