PHP SimpleXML:如何访问嵌套的命名空间?
PHP SimpleXML: How to access nested namespaces?
鉴于此 XML 结构:
$xml = '<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<item>
<title>Title</title>
<media:group>
<media:content url="url1" />
<media:content url="url2" />
</media:group>
</item>
<item>
<title>Title2</title>
<media:group>
<media:content url="url1" />
<media:content url="url2" />
</media:group>
</item>
</channel>
</rss>';
$xml_data = new SimpleXMLElement($xml);
如何访问 media:content 节点的属性?我试过了
foreach ($xml_data->channel->item as $key => $data) {
$urls = $data->children('media', true)->children('media', true);
print_r($urls);
}
和
foreach ($xml_data->channel->item as $key => $data) {
$ns = $xml->getNamespaces(true);
$urls = $data->children('media', true)->children($ns['media']);
print_r($urls);
}
根据其他答案,但它们都return空简单XML元素。
当你用 SimpleXML 回显 XML 时,你需要使用 asXML()
才能看到真正的内容,print_r()
有自己的版本,没有显示全部内容...
foreach ($xml_data->channel->item as $key => $data) {
$urls = $data->children('media', true)->children('media', true);
echo $urls->asXML().PHP_EOL;
}
回声...
<media:content url="url1"/>
<media:content url="url1"/>
它只输出每个组的第一个,因为您需要添加另一个 foreach
来遍历每个元素的所有子节点。
foreach ($xml_data->channel->item as $key => $data) {
echo $data->title.PHP_EOL;
foreach ( $data->children('media', true)->children('media', true) as $content ) {
echo $content->asXML().PHP_EOL;
}
}
输出..
Title
<media:content url="url1"/>
<media:content url="url2"/>
Title2
<media:content url="url1"/>
<media:content url="url2"/>
要访问特定属性(例如第二个代码示例中的 url 属性),您必须使用 attributes()
方法...
echo $content->attributes()['url'];
鉴于此 XML 结构:
$xml = '<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<item>
<title>Title</title>
<media:group>
<media:content url="url1" />
<media:content url="url2" />
</media:group>
</item>
<item>
<title>Title2</title>
<media:group>
<media:content url="url1" />
<media:content url="url2" />
</media:group>
</item>
</channel>
</rss>';
$xml_data = new SimpleXMLElement($xml);
如何访问 media:content 节点的属性?我试过了
foreach ($xml_data->channel->item as $key => $data) {
$urls = $data->children('media', true)->children('media', true);
print_r($urls);
}
和
foreach ($xml_data->channel->item as $key => $data) {
$ns = $xml->getNamespaces(true);
$urls = $data->children('media', true)->children($ns['media']);
print_r($urls);
}
根据其他答案,但它们都return空简单XML元素。
当你用 SimpleXML 回显 XML 时,你需要使用 asXML()
才能看到真正的内容,print_r()
有自己的版本,没有显示全部内容...
foreach ($xml_data->channel->item as $key => $data) {
$urls = $data->children('media', true)->children('media', true);
echo $urls->asXML().PHP_EOL;
}
回声...
<media:content url="url1"/>
<media:content url="url1"/>
它只输出每个组的第一个,因为您需要添加另一个 foreach
来遍历每个元素的所有子节点。
foreach ($xml_data->channel->item as $key => $data) {
echo $data->title.PHP_EOL;
foreach ( $data->children('media', true)->children('media', true) as $content ) {
echo $content->asXML().PHP_EOL;
}
}
输出..
Title
<media:content url="url1"/>
<media:content url="url2"/>
Title2
<media:content url="url1"/>
<media:content url="url2"/>
要访问特定属性(例如第二个代码示例中的 url 属性),您必须使用 attributes()
方法...
echo $content->attributes()['url'];