Accessing @attribute from SimpleXML
访问我的SimpleXML对象的@attribute部分时遇到问题。 当我var_dump整个对象时,我得到正确的输出,而当我var_dump其余对象(嵌套标签)时,我得到正确的输出,但是当我遵循docs和var_dump ,尽管第一个var_dump清楚地表明存在要输出的属性,但我还是得到了一个空对象。
任何人都知道我在这里做错了/如何进行这项工作?
-
当涉及到SimpleXML时,var_dump()具有误导性。 不要从字面上看其输出。 另外,您不能使用数组访问来访问属性吗? 例如 $ xml-> OFFICE [MyAttribute]?
-
如果要使用[@attributes],则需要先将SimpleXMLElement强制转换为数组
-
另一个Access SimpleXML属性参考问题("如何从PHP中的XML文件获取属性的值?")
尝试这个
1
| $xml->attributes()->Token |
-
@Artefacto已经回答了。
-
是的,但形式更难
-
是的,这是最优雅的解决方案。
-
香港专业教育学院尝试过这一点,我认为页面崩溃了。下面的Bora似乎认为这是一种错误的格式,我目前同意。。但是我已经多次看到这种(您的)格式。我缺少一些细微差别吗?
-
@ GerardONeill,我不明白为什么Bora说了错误的访问属性的方式,它工作得非常完美。您可能缺少的是,您需要在与XML中正确标签相对应的对象上调用attributes()。就像您有b一样,则需要执行$xml->tag->attributes()->attr才能访问它。
-
这为我返回null,可能不是因为答案有误,而是因为答案缺乏足够的解释供我正确使用。
-
当我这样调用时-我没有获得属性值,我得到的SimpleXMLElement包含0 =" 2001"(2001是我的值)。如果我使用0-$ xml-> Policy-> CommlPolicy-> CommlCoverage [0]-> attributes()-> id [0],那么我再次得到相同的0 =" 2001"。那是什么?
-
为什么这不是选择的答案,上一次我因为看不到更高的答案(不是最正确的答案)而浪费了几个小时,所以我不得不阅读完整的sitepoint.com/parsing-xml-with-simplexml文章,以寻求解决方案, x8>用于具体检索模式属性
您可以通过在XML节点上调用attribute()函数来获取XML元素的属性。然后,您可以var_dump函数的返回值。
php.net上的更多信息
http://php.net/simplexmlelement.attributes
该页面的示例代码:
1 2 3 4 5
| $xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
echo $a,'="',$b,""
";
} |
-
有趣的是,$b将是一个SimpleXMLElement对象,因此print_r和var_dump将给您带来奇怪的事情。您可以将其转换为字符串(或任意类型)以解决此问题。
-
执行"。$ b以使其保持字符串形式
我之前用过很多次来获得@attributes,如下所示,它花了更长的时间。
1 2
| $att = $xml->attributes();
echo $att['field']; |
它应该更简单,并且可以一次获得以下格式的属性:
标准方式-阵列访问属性(AAA)
其他替代方法是:
正确和快速格式
1
| $xml->attributes()->{'field'}; |
格式错误
1 2 3 4 5
| $xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field']; |
-
我同意您的第一种错误格式,因为我遇到了页面崩溃的问题-但是,许多人声称这样做有效。任何解释或细微之处?
-
"格式错误"起作用。我总是用第一个例子。为什么错了?
-
从技术上讲,$xml->attributes()->{field},$xml->attributes()->field和$f=field; $xml->attributes()->$f;是相同的。看不出为什么一个是正确的格式而另一个是错误的原因。
-
$ xml-> attributes()-> {field}是正确的,因为它可以安全地与属性名称中的特殊字符一起使用(即" data-attr")。 $ xml-> attributes()->字段仅适用于单个字母数字单词的属性
-
同时使用两个正确的选项时获取SimpleXMLElement。
1 2 3 4 5 6 7 8 9
| $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处理程序)。很有意思。
-
这样做时获取SimpleXMLElement而不是值
您可以这样做:
如果您正在寻找这些属性的列表,XPath将是您的朋友
它帮助我将simplexml_load_file($ file)的结果转换为JSON结构并解码回去:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $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
) |
不幸的是,我有一个独特的PHP 5.5版本(暂时被Gentoo所困扰),而我发现的是
1
| $xml->tagName['attribute'] |
是唯一有效的解决方案。我尝试了上述Bora的所有方法,包括" Right&Quick"格式,但都失败了。
这是最简单的格式,这一事实是有加分的,但是我并不觉得我疯狂地尝试了其他人说过的所有格式。
Njoy具有什么价值(我提到过独特的构建吗?)。
-
通常,我建议对属性使用数组表示法,以表示其所属元素的相同名称空间中的属性。 ID表示其最简单的格式(如您所愿)是有原因的。带有名为key =属性且具有simplexml元素的array-access。