【问题标题】:Read colon tags values XML PHP读取冒号标签值 XML PHP
【发布时间】:2016-10-17 23:26:27
【问题描述】:

我已经阅读了这些主题: PHP library for parsing XML with a colons in tag names?Simple XML - Dealing With Colons In Nodes 但我无法实施这些解决方案。

<item>
<title> TITLE </title>
<itunes:author> AUTHOR </itunes:author>
<description> TEST </description>
<itunes:subtitle> TEST </itunes:subtitle>
<itunes:summary> TEST </itunes:summary>
<itunes:image href="yoyoyoyo.jpg"/>
<pubDate> YESTERDAY </pubDate>
<itunes:block>no</itunes:block>
<itunes:explicit>no</itunes:explicit>
<itunes:duration>99:99:99</itunes:duration>
<itunes:keywords>key, words</itunes:keywords>
</item>

我只想获得 itunes:duration 和 itunes:image。这是我的代码:

$result = simplexml_load_file("http://blablabla.com/feed.xml");

$items = $result->xpath("//item");

foreach ($items as $item) {

    echo $item->title;
    echo $item->pubDate;
}

我尝试使用children() 方法,但是当我尝试使用print_r 时,它说节点不再存在。

【问题讨论】:

  • 根据qualified names 的w3c 规则,必须在根元素或祖先元素中定义命名空间前缀。除非您的帖子是 sn-p,否则您的 XML 中的任何位置都不会定义 itunes 命名空间,例如:xmlns:itunes="http://www.apple.com"
  • 这不是我的 XML,它来自我计划抓取它的网站。 =)

标签: php xml


【解决方案1】:

您应该在$item 元素上使用children() 来获取它的子元素:

$str =<<< END
<item>
<title> TITLE </title>
<itunes:author> AUTHOR </itunes:author>
<description> TEST </description>
<itunes:subtitle> TEST </itunes:subtitle>
<itunes:summary> TEST </itunes:summary>
<itunes:image href="yoyoyoyo.jpg"/>
<pubDate> YESTERDAY </pubDate>
<itunes:block>no</itunes:block>
<itunes:explicit>no</itunes:explicit>
<itunes:duration>99:99:99</itunes:duration>
<itunes:keywords>key, words</itunes:keywords>
</item>
END;

$result = @simplexml_load_string($str);

$items = $result->xpath("//item");

foreach ($items as $item) {
    echo $item->title . "\n";
    echo $item->pubDate . "\n";
    echo $item->children()->{'itunes:duration'} . "\n";
}

输出:

TITLE
YESTERDAY
99:99:99

【讨论】:

  • 我明白了。非常感谢德克尔。我必须阅读有关 xpath 的更多信息,因为我无法在任何地方找到它。
  • 抱歉更正,但我测试了您的代码(以及更改后的代码),但没有一个有效。 99:99:99 也没有显示在您的代码上,我复制粘贴了它。
  • 好吧,我用 $item->children()->duration 代替了它。我不知道为什么它接受持续时间但不接受 itunes:duration。当我在 $item 上执行 print_r 时,它显示元素为“duration”而不是 ïtunes:duration"
【解决方案2】:

如果 Dekel 不适合某人,这是我的替代解决方案。

使用方法getNamespaces

$result = simplexml_load_file("http://blablabla.com/feed.xml");

$items = $result->xpath("//item");

foreach ($items as $item) 
{

    $itunesSpace = $item->getNameSpaces(true);
    $nodes = $item->children($itunesSpace['itunes']);

    //TEST
    echo $nodes->subtitle

    //99:99:99
    echo $nodes->duration

    //If you want the image Href

    $imageAux = $nodes->image->attributes();
    //yoyoyoyo.jpg
    echo $imageAux['href'];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2011-08-13
    • 2015-07-04
    • 2011-03-09
    相关资源
    最近更新 更多