这是一个后续问题:在PHP 中获取XML属性
我很难获得带有名称空间前缀的元素值。请参阅以下示例:http://itunes.apple.com/us/rss/toppaidapplications/limit=10/genre=6014/xml
<im:image height="53">http://a2.mzstatic.com/us/r1000/114/Purple/v4/bc/0e/86/bc0e8619-5d48-1efe-2ac3-662696fb9a34/mzl.bimldzcn.53x53-50.png</im:image>
<im:image height="75">http://a3.mzstatic.com/us/r1000/114/Purple/v4/bc/0e/86/bc0e8619-5d48-1efe-2ac3-662696fb9a34/mzl.bimldzcn.75x75-65.png</im:image>
如果我尝试使用$e->im:image引用元素,我会得到以下错误:
PHP Parse error: syntax error, unexpected ':'
$e->'m:image'给我的是:
PHP Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting T_STRING or T_VARIABLE or '{' or '$'
有什么建议吗?
更新:我编辑了问题标题,这是误导。它实际上是我感兴趣的带有名称空间前缀(而不是属性)的元素值
使用SimpleXML时(如您前面的问题所建议的),您必须使用children()方法来获取某个命名空间的所有子元素,与attributes()方法相同。
例如
<?php
define('URI_RSS', 'http://itunes.apple.com/rss');
$feed = new SimpleXMLElement(getData());
foreach( $feed->entry as $entry ) {
$attributes = $entry->id->attributes(URI_RSS);
echo 'id[im:id]: ', $attributes['id'], "'n";
$attributes = $entry->category->attributes(URI_RSS);
echo 'category[im:id]: ', $attributes['id'], "'n";
$imElements = $entry->children(URI_RSS);
foreach( $imElements as $name=>$c ) {
echo $name, '=', $c, "'n";
}
}
function getData() {
return <<< eot
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:im="http://itunes.apple.com/rss" xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<id>someid</id><title>some title</title><updated>2012-09-10T02:12:06-07:00</updated><link rel="alternate" type="text/html" href="http://link1"/><link rel="self" href="http://link12"/><icon>http://iconlink1</icon><author><name>some name</name><uri>http://uri</uri></author><rights>all rights wronged</rights>
<entry>
<updated>2012-09-10T02:12:06-07:00</updated>
<id im:id="123456789" im:bundleId="a.bundle.id">http://id</id>
<title>some title</title>
<summary>This is the summary.
A short text summarizing the complete article
</summary>
<im:name>imname</im:name>
<link rel="alternate" type="text/html" href="http://alternate"/>
<im:contentType term="Application" label="Application"/>
<category im:id="7890" term="example" scheme="http://scheme" label="example"/>
<link title="Preview" rel="enclosure" type="image/jpeg" href="http://preview" im:assetType="preview"><im:duration>0</im:duration></link>
<im:artist href="http://artist">sample artist</im:artist>
<im:price amount="0.99000" currency="USD">$0.99</im:price>
<im:image height="53">http://1.png</im:image>
<im:image height="75">http://2.png</im:image>
<im:image height="100">http://3.png</im:image>
<rights>all rights wronged</rights>
<im:releaseDate label="August 28, 2012">2012-08-28T00:00:00-07:00</im:releaseDate>
<content type="html">content
content
content
</content>
</entry>
</feed>
eot;
}
打印
id[im:id]: 123456789
category[im:id]: 7890
name=imname
contentType=
artist=sample artist
price=$0.99
image=http://1.png
image=http://2.png
image=http://3.png
releaseDate=2012-08-28T00:00:00-07:00
-->php domdocument
-->通过标签名称和命名空间获取元素
好的,明白了。
答案是指定命名空间。
例如,参见前面的问题和用法:
$im = $e->children('http://itunes.apple.com/rss');