Php 从SimpleXML访问@attribute

Php 从SimpleXML访问@attribute,php,xml,simplexml,Php,Xml,Simplexml,访问SimpleXML对象的@属性部分时遇到问题。当我var_dump整个对象时,我得到正确的输出,当我var_dump对象的其余部分(嵌套标记)时,我得到正确的输出,但是当我遵循文档和var_dump$xml->OFFICE->{@attributes}时,我得到一个空对象,尽管第一个var_dump清楚地显示了要输出的属性 有人知道我在这里做错了什么/我如何做到这一点吗?您可以通过调用XML节点上的attributes()函数来获取XML元素的属性。然后,您可以var_转储函数的返回值 更多

访问SimpleXML对象的
@属性
部分时遇到问题。当我
var_dump
整个对象时,我得到正确的输出,当我
var_dump
对象的其余部分(嵌套标记)时,我得到正确的输出,但是当我遵循文档和
var_dump
$xml->OFFICE->{@attributes}
时,我得到一个空对象,尽管第一个
var_dump
清楚地显示了要输出的属性


有人知道我在这里做错了什么/我如何做到这一点吗?

您可以通过调用XML节点上的attributes()函数来获取XML元素的属性。然后,您可以var_转储函数的返回值

更多信息请访问php.net

来自该页面的示例代码:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}
$xml=elem[“attrib”]
使用

事实上,SimpleXMLElement处理程序一直在撒谎。没有名为“@attributes”的属性,因此您不能执行
$sxml->elem->{“@attributes”}[“attrib”]

您可以执行以下操作:

echo $xml['token'];

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

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

$xml->attributes()->Token

我以前用过很多次来获取
@attributes
,就像下面这样,时间长了一点

$att = $xml->attributes();
echo $att['field'];
这应该更容易,并且您只能一次获得以下格式的属性:

标准方式-阵列访问属性(AAA) 其他备选方案包括:

右快速格式 错误格式
不幸的是,我有一个独特的PHP5.5构建(目前仍使用Gentoo),我发现

 $xml->tagName['attribute']
这是唯一有效的解决方案。我尝试了上面Bora的所有方法,包括“正确快速”格式,但都失败了

事实上,这是最简单的格式是一个加号,但我不喜欢认为我是疯了尝试所有其他人说的格式工作


Njoy的价值(我提到了独特的构建吗?)

它帮助我将simplexml加载文件($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
)

对于SimpleXML来说,var_dump()具有误导性。不要照字面理解它的输出。另外,您不能使用数组访问访问属性吗?e、 g.$xml->OFFICE['MyAttribute']?如果你想使用['@attributes'],你需要先将SimpleXMLElement转换为数组。这已经得到了回答。是的,这是最优雅的解决方案。我已经尝试过了,我认为页面正在崩溃。下面的Bora似乎认为这是一种错误的格式,我现在同意这一点。。然而,我已经多次看到这种(你的)格式被提及。“我缺少了一些细微差别吗?”杰拉德·奥尼尔,我不明白为什么宝来说访问属性的方法是错误的,它工作得非常完美。您可能缺少的是需要对XML中与正确标记对应的对象调用
attributes()
。例如,如果您有
b
,那么您需要执行
$xml->tag->attributes()->attr
来访问它。这会为我返回null,可能不是因为答案错误,而是因为答案缺乏足够的解释,我无法正确使用它。感谢您解释为什么SimpleXML会以这种奇怪的方式运行(
get\u properties
处理程序)。非常有趣。在执行此操作时获取SimpleXMLElement,而不是value有趣的是,
$b
将是一个
SimpleXMLElement
对象,因此
print\u r
var\u dump
将给您带来奇怪的东西。您可以将其转换为字符串(或任何您喜欢的内容)来解决此问题。Do“”.$b将其保留为字符串我同意你的第一个错误格式,因为我遇到了页面崩溃——但有多人声称这是有效的。对此有任何解释或细微差别吗?“错误格式”有效。我总是使用第一个示例。为什么错了?从技术上讲,
$xml->attributes()->{field}
$xml->attributes()->字段
$f='field';$xml->attributes()->$f;
是相同的。请看不出其中一种格式正确,另一种格式错误的原因。$xml->attributes()->{field'}是正确的,因为它可以安全地与属性名称中的特殊字符(即“数据属性”)一起使用。$xml->attributes()->字段仅适用于使用两个正确选项时设置SimpleXMLElement的单个字母数字单词的属性。我通常建议在其所在元素的同一名称空间中为属性使用数组表示法。我认为这是最简单的格式(如您所言)原因之一。使用simplexml元素的命名key=属性进行数组访问。
$xml->attributes()->{'field'};
$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];
 $xml->tagName['attribute']
$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
)