从SimpleXML访问@attribute


120

我在访问@attributeSimpleXML对象的部分时遇到问题。当我var_dump整个对象时,我得到正确的输出,当我var_dump其余对象(嵌套标签)时,我得到正确的输出,但是当我遵循docs和时var_dump $xml->OFFICE->{'@attributes'},我得到一个空对象,尽管事实是第一个var_dump清楚地表明,存在要输出的属性。

任何人都知道我在这里做错了/如何进行这项工作?


5
当涉及到SimpleXML时,var_dump()具有误导性。不要从字面上看其输出。另外,您不能使用数组访问来访问属性吗?例如$ xml-> OFFICE ['MyAttribute']?
Frank Farmer

如果要使用['@attributes'],则需要先将SimpleXMLElement强制转换为数组
Enrique

Answers:


88

您可以通过在XML节点上调用attribute()函数来获取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_r并且var_dump会给您带来奇怪的事物。您可以将其转换为字符串(或任意类型)以解决此问题。
jxmallett 2014年

做“”。$ b以字符串形式保存
dr_rk 16-3-3

135

试试这个

$xml->attributes()->Token


45
是的,但形式更难
zysoft 2012年

2
是的,这是最优雅的解决方案。
基督教徒

我已经尝试过了,我认为页面崩溃了。下面的Bora似乎认为这是一种错误的格式,我目前对此表示同意。但是,我已经多次看到这种(您的)格式。我想念一些细微差别吗?
杰拉德·奥尼尔

2
@GerardONeill,我不明白为什么Bora说访问属性是错误的方式,它工作得非常完美。您可能缺少的是,您需要调用attributes()与XML中正确标签相对应的对象。就像您拥有的<root><tag attr="a">b</tag></root>话,那么您需要$xml->tag->attributes()->attr进行访问。
zysoft

54

我之前曾多次使用@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

1
“格式错误”起作用。我总是用第一个例子。为什么错了?
Grzegorz 2015年

3
技术上,$xml->attributes()->{'field'}$xml->attributes()->field,和$f='field'; $xml->attributes()->$f;是相同的。看不出为什么一个是正确的格式而另一个是错误的原因。
zysoft

$ xml-> attributes()-> {'field'}是正确的,因为可以安全地使用属性名称中的特殊字符(即“ data-attr”)。$ xml-> attributes()->字段仅适用于单个字母数字单词的属性
vzr

同时使用两个正确的选项时获取SimpleXMLElement。
Darius.V,

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 2014年

在执行此操作而不是值时获取SimpleXMLElement
Darius.V,2007年


8

如果您正在寻找这些属性的列表,XPath将是您的朋友

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

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']

是唯一有效的解决方案。我尝试了上述Bora的所有方法,包括“ Right&Quick”格式,但都失败了。

这是最简单的格式,这一事实是有加分的,但是我并不觉得我疯狂地尝试了别人说过的所有格式。

Njoy具有什么价值(我提到过独特的构建吗?)。


通常,我建议对属性使用数组表示法,以表示其所属元素的相同名称空间中的属性。我会说这是最简单的格式(如您所说)。带有名为key =属性且具有simplexml元素的array-access。
hakre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.