PHP Conference Nagoya 2025

SimpleXMLElement::attributes

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::attributes要素の属性を定義する

説明

public SimpleXMLElement::attributes(?string $namespaceOrPrefix = null, bool $isPrefix = false): ?SimpleXMLElement

この関数は、XMLタグの中で定義された属性とその値を取得します。

注意: SimpleXML では、ほとんどのメソッドに反復処理を追加するための手順が定義されています。 これらは、var_dump() やオブジェクトを評価する他の手段で 見ることはできません。

パラメータ

namespaceOrPrefix

オプションで指定する、取得した属性の名前空間。

isPrefix

デフォルトは false

戻り値

SimpleXMLElement オブジェクトを返します。 これを反復処理すれば、そのタグの属性を順に処理することができます。

タグではなく属性を指している SimpleXMLElement に対してコールした場合は null を返します。

例1 XML文字列を解釈する

<?php
$string
= <<<XML
<a>
<foo name="one" game="lonely">1</foo>
</a>
XML;

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

上の例の出力は以下となります。

name="one"
game="lonely"

add a note

User Contributed Notes 6 notes

up
46
Xeoncross
14 years ago
It is really simple to access attributes using array form. However, you must convert them to strings or ints if you plan on passing the values to functions.

<?php
SimpleXMLElement Object
(
[@
attributes] => Array
(
[
id] => 55555
)

[
text] => "hello world"
)
?>

Then using a function

<?php
function xml_attribute($object, $attribute)
{
if(isset(
$object[$attribute]))
return (string)
$object[$attribute];
}
?>

I can get the "id" like this

<?php
print xml_attribute($xml, 'id'); //prints "55555"
?>
up
28
chris at chlab dot ch
12 years ago
Note that you must provide the namespace if you want to access an attribute of a non-default namespace:

Consider the following example:

<?php
$xml
= <<<XML
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Table Foo="Bar" ss:ExpandedColumnCount="7">
</Table>
</Workbook>
XML;

$sxml = new SimpleXMLElement($xml);

/**
* Access attribute of default namespace
*/
var_dump((string) $sxml->Table[0]['Foo']);
// outputs: 'Bar'

/**
* Access attribute of non-default namespace
*/
var_dump((int) $sxml->Table[0]['ExpandedColumnCount']);
// outputs: 0

var_dump((int) $sxml->Table[0]->attributes('ss', TRUE)->ExpandedColumnCount);
// outputs: '7'
?>
up
28
sarlak
13 years ago
<?php
$att
= 'attribueName';

// You can access an element's attribute just like this :
$attribute = $element->attributes()->$att;

// This will save the value of the attribute, and not the objet
$attribute = (string)$element->attributes()->$att;

// You also can edit it this way :
$element->attributes()->$att = 'New value of the attribute';
?>
up
15
totalwipeout at gmail dot com
12 years ago
Tip to get a real array of all attributes of a node (not SimpleXML's object acting like an array)

<?php
//- $node is a SimpleXMLElement object

$atts_object = $node->attributes(); //- get all attributes, this is not a real array
$atts_array = (array) $atts_object; //- typecast to an array

//- grab the value of '@attributes' key, which contains the array your after
$atts_array = $atts_array['@attributes'];

var_dump($atts_object); //- outputs object(SimpleXMLElement)[19]
//- public '@attributes' => ...

var_dump($atts_array); //- outputs array (size=11) ...

?>
Hope this helps!
up
2
andy dot locologic+101 at gmail dot com
9 years ago
Easiest and safest way to get attributes as an array is to use the iterator_to_array function (see http://php.net/manual/en/function.iterator-to-array.php):

<?php
$x
= new SimpleXMLElement('<div class="myclass" id="myid"/>');
$attributes = iterator_to_array($x->attributes());
?>
up
2
webfelipemaia at gmail dot com
11 years ago
Use attributes to display when it meets certain condition defined attribute / value in xml tags.

Use atributos para exibir quando atende determinada condição definida atributo / valor em tags XML.

Consider the following example:
Considere o seguinte exemplo:

(file.xml)

<?xml version="1.0" encoding="UTF-8"?>

<list>
<item type="Language">
<name>PHP</name>
<link>www.php.net</link>
</item>
<item type="Database">
<name>Java</name>
<link>www.oracle.com/br/technologies/java/‎</link>
</item>
</list>

Checks if the attribute value equals "Language", if equal prints everything that is related to "Language".

Verifica se o valor do atributo é igual a "Language", se for, imprime tudo o que for relativo ao mesmo.

<?php

$xml
= simplexml_load_file("file.xml");

foreach(
$xml->children() as $child) {

$role = $child->attributes();

foreach(
$child as $key => $value) {

if(
$role == "Language")
echo(
"[".$key ."] ".$value . "<br />");

}
}
?>

output:
saída:

[name] PHP
[link] www.php.net
To Top