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"

添加注释

用户贡献注释 15 个注释

Xeoncross
14 年前
使用数组形式访问属性非常简单。但是,如果您打算将这些值传递给函数,则必须将它们转换为字符串或整数。

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

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

然后使用一个函数

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

我可以这样获取“id”

<?php
print xml_attribute($xml, 'id'); // 打印 "55555"
?>
chris at chlab dot ch
12 年前
请注意,如果您要访问非默认命名空间的属性,则必须提供命名空间

考虑以下示例

<?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']);
// 输出: 'Bar'

/**
* 访问非默认命名空间的属性
*/
var_dump((int) $sxml->Table[0]['ExpandedColumnCount']);
// 输出: 0

var_dump((int) $sxml->Table[0]->attributes('ss', TRUE)->ExpandedColumnCount);
// 输出: '7'
?>
sarlak
13 年前
<?php
$att
= 'attribueName';

// 您可以像这样访问元素的属性:
$attribute = $element->attributes()->$att;

// 这将保存属性的值,而不是对象
$attribute = (string)$element->attributes()->$att;

// 您也可以这样编辑它:
$element->attributes()->$att = 'New value of the attribute';
?>
totalwipeout at gmail dot com
11 年前
获得节点所有属性的真实数组的技巧(不是充当数组的 SimpleXML 的对象)

<?php
//- $node 是一个 SimpleXMLElement 对象

$atts_object = $node->attributes(); //- 获取所有属性,这不是一个真正的数组
$atts_array = (array) $atts_object; //- 类型转换为数组

//- 获取 '@attributes' 键的值,其中包含您要查找的数组
$atts_array = $atts_array['@attributes'];

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

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

?>
希望这有帮助!
andy dot locologic+101 at gmail dot com
9 年前
获取属性数组最简单、最安全的方法是使用 iterator_to_array 函数(参见 https://php.net/manual/en/function.iterator-to-array.php)。

<?php
$x
= new SimpleXMLElement('<div class="myclass" id="myid"/>');
$attributes = iterator_to_array($x->attributes());
?>
webfelipemaia at gmail dot com
10 年前
使用属性在满足 XML 标签中定义的特定条件时显示内容。

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

考虑以下示例
考虑以下示例

(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>

检查属性值是否等于 "Language",如果相等,则打印与 "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 />");

}
}
?>

输出
saída

[name] PHP
[link] www.php.net
leap
13 年前
如果你想将属性值保存到数组中,请将其强制转换为字符串。

<?php
// 存储一个 xml-element-object
$dataStore['value'] = $attributes->myValue

// 存储属性值
$dataStore['value'] = (string)$attributes->myValue
?>
alan at performantsystems dot com
14 年前
假设你有一个名为 $xmlstring 的 XML 字符串,其中包含数据库类型数据,键或项目 ID 作为 XML 属性,所有内容数据作为常规 XML 元素,如上所示。SimpleXML 将属性处理为数组,因此我们可以协同工作并将属性推送到数组中。然后,我们可以通过名称(例如 "ID")来获取任何特定属性的值。

考虑以下数据

<?xml 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>

列出 ID 属性和 Company 元素值的示例

<?php
$xmlObject
= new SimpleXMLElement($xmlstring);
foreach (
$xmlObject->children() as $node) {
$arr = $node->attributes(); // 返回一个数组
print ("ID=".$arr["ID"]); // 获取此属性的值
print (" Company=".$node->Company);
print (
"<p><hr>");
}
?>
skerr at mojavi dot org
19 年前
你也可以将节点作为数组访问以获取属性

<?php

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

echo
'Attribute: ' . $xml['attribute'];

?>
gillllberg at gmail dot com
14 年前
要获取节点中的属性,请使用 node->attributes()->attributeName
Andrei
13 年前
读取具有命名空间前缀的根元素的属性,如 Atom 提要中所示

<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/&quot;Ck4EQXYzeCp7ImA9WhZWFE4.&quot;">

<?php
$xml
= @simplexml_load_file($feed);
$att_gd = $xml->attributes("gd",1);
$Etag = $att_gd["etag"];
?>
jurchiks101 at gmail dot com
6 年前
一种未记录的方法(在我看来,这是一种技巧)来获取元素的值或属性
(但不能同时获取两者)而无需类型转换,可以使用函数 `current()`

<?php
$xml
= new SimpleXMLElement(<<<'XML'
<foo>
<bar>1</bar>
<baz name="baz" />
<qux name="qux">3</qux>
</foo>
XML
);

var_dump([
'bar' => [
$xml->bar,
current($xml->bar),
],
'baz' => [
$xml->baz->attributes(),
current($xml->baz->attributes()),
],
'qux' => [
// 在这里不能正确工作
$xml->qux,
current($xml->qux),
$xml->qux->attributes(),
current($xml->qux->attributes()),
],
]);
?>

结果如下(重新格式化以缩短长度)
```
array(3) {
'bar' => array(2) {
[0] => class SimpleXMLElement#2 (1) {
public ${0} => string(1) "1"
}
[1] => string(1) "1"
}
'baz' => array(2) {
[0] => class SimpleXMLElement#5 (1) {
public $@attributes => array(1) {
...
}
}
[1] => array(1) {
'name' => string(3) "baz"
}
}
'qux' => array(4) {
[0] => class SimpleXMLElement#6 (2) {
public $@attributes => array(1) {
...
}
public ${0} => string(1) "3"
}
[1] => array(1) {
'name' => string(3) "qux"
}
[2] => class SimpleXMLElement#7 (1) {
public $@attributes => array(1) {
...
}
}
[3] => array(1) {
'name' => string(3) "qux"
}
}
}
```

这似乎将元素读取为数组,并只返回第一个属性的值,无论它是属性还是值。如第三个示例所示,这不可靠,尤其是当你解析来自外部来源的 XML 时,该来源可能包含或可能不包含你想要获取值的元素的属性。

我当然不建议任何人使用它,因为它没有记录,并且它只是巧合地起作用,因此它可能在将来未经通知的情况下中断。
zevnikrok
9 年前
如果你想将属性作为键值对的关联数组获取,你不需要遍历它们,你可以使用以下单行代码获取它们

reset($element->attributes())
adrian at foeder dot de
11 年前
为了获取可能存在的 xml:space 属性,请使用以下结构

<?php
$simpleXmlElement
->element->attributes('http://www.w3.org/XML/1998/namespace')->space;
?>

例如,如果设置了该属性,它将返回 'preserve'。

仅仅传递 'xml' 作为 attribute() 方法的命名空间参数对我来说并不起作用。传递完整的命名空间 URI 也有效,即使它没有在底层 XML 文档中明确定义。

此外,$simpleXmlElement->getNamespaces() 不会返回任何有用的信息。
inge at elektronaut dot no
20 年前
以下是一个简单函数,用于根据示例获取名为 name 的属性

<?php
function findAttribute($object, $attribute) {
foreach(
$object->attributes() as $a => $b) {
if (
$a == $attribute) {
$return = $b;
}
}
if(
$return) {
return
$return;
}
}
?>
To Top