©
本文档使用
php.cn手册 发布
(PHP 5 >= 5.0.1)
SimpleXMLElement::attributes — Identifies an element's attributes
$ns
= NULL
[, bool $is_prefix
= false
]] )This function provides the attributes and values defined within an xml tag.
Note: SimpleXML 建起了一个给大多数方法添加迭代属性的规则。不能通过使用 var_dump() 或任何可检查对象的其它东西来查看。
ns
An optional namespace for the retrieved attributes
is_prefix
Default to FALSE
Returns a SimpleXMLElement object that can be iterated over to loop through the attributes on the tag.
Returns NULL
if called on a SimpleXMLElement
object that already represents an attribute and not a tag.
Example #1 Interpret an XML string
<?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"
[#1] andy dot locologic+101 at gmail dot com [2015-08-14 10:00:35]
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());
?>
[#2] zevnikrok [2014-12-18 23:01:54]
If you wish to get attributes as an associative array of key value pairs, you don't need to iterate through them, you can get it with this one liner:
reset($element->attributes())
[#3] webfelipemaia at gmail dot com [2013-09-07 05:11:24]
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)
<?phpxml 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
[#4] adrian at foeder dot de [2013-06-14 10:15:17]
in order to get a possibly present xml:space attribute, use the following construct:
<?php
$simpleXmlElement->element->attributes('http://www.w3.org/XML/1998/namespace')->space;
?>
This will, for example, return 'preserve' if set.
Just passing by 'xml' as namespace argument of the attribute() method didn't work out for me. Passing by the complete namespace URI works also if it is not explicitly defined in the underlying XML document.
Also, $simpleXmlElement->getNamespaces() does not return anything of use.
[#5] totalwipeout at gmail dot com [2012-11-08 17:21:14]
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!
[#6] chris at chlab dot ch [2012-03-23 10:16:05]
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);
var_dump((string) $sxml->Table[0]['Foo']);
// outputs: 'Bar'
var_dump((int) $sxml->Table[0]['ExpandedColumnCount']);
// outputs: 0
var_dump((int) $sxml->Table[0]->attributes('ss', TRUE)->ExpandedColumnCount);
// outputs: '7'
?>
[#7] Andrei [2011-05-16 16:46:24]
Reading the attributes of the root element with name space prefixes as in an Atom feed
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/"Ck4EQXYzeCp7ImA9WhZWFE4."">
<?php
$xml = @simplexml_load_file($feed);
$att_gd = $xml->attributes("gd",1);
$Etag = $att_gd["etag"];
?>
[#8] sarlak [2011-04-27 13:12:39]
<?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';
?>
[#9] leap [2011-04-02 09:07:16]
If you want to save the value of an attribute into an array, typecast it to a string.
<?php
// stores an xml-element-object
$dataStore['value'] = $attributes->myValue
// stores the value of the attribute
$dataStore['value'] = (string)$attributes->myValue
?>
[#10] alan at performantsystems dot com [2010-05-23 22:26:44]
So lets say you have database type data in an XML string called $xmlstring with the key or item ID as an XML Attribute and all content data as regular XML Elements, as above. SimpleXML processes the Attributes as an array, so we can play along and push the Attributes into an array. Then we can get the value of any specific Attribute we want by addressing it by name, such as "ID".
Considering this data:
<?phpxml version="1.0" encoding="utf-8"?>
<data>
<item ID="30001">
<Company>Navarro Corp.</Company>
</item>
<item ID="30002">
<Company>Performant Systems</Company>
</item>
<item ID="30003">
<Company>Digital Showcase</Company>
</item>
</data>
Example of listing both the ID Attribute and Company Element values:
<?php
$xmlObject = new SimpleXMLElement($xmlstring);
foreach ($xmlObject->children() as $node) {
$arr = $node->attributes(); // returns an array
print ("ID=".$arr["ID"]); // get the value of this attribute
print (" Company=".$node->Company);
print ("<p><hr>");
}
?>
[#11] Xeoncross [2010-04-10 19:46:05]
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"
?>
[#12] gillllberg at gmail dot com [2009-11-04 14:21:23]
To get an attribute in the node, use node->attributes()->attributeName
[#13] skerr at mojavi dot org [2004-12-09 22:55:27]
You can also access the node as an array to get attributes:
<?php
$xml = simplexml_load_file('file.xml');
echo 'Attribute: ' . $xml['attribute'];
?>
[#14] inge at elektronaut dot no [2004-05-26 10:53:58]
here's a simple function to get an attribute by name, based on the example
<?php
function findAttribute($object, $attribute) {
foreach($object->attributes() as $a => $b) {
if ($a == $attribute) {
$return = $b;
}
}
if($return) {
return $return;
}
}
?>