具有命名空间和PHP的相同嵌套XML元素

时间:2012-05-23 17:58:32

标签: php xml

尽我所能,我似乎无法在第12行的嵌套apcm:Property元素中获取“Id”属性的值,其中“Name”属性等于“sequenceNumber”。如您所见,那里感兴趣的元素被隐藏在具有相同名称和命名空间的其他元素的嵌套中。

使用PHP,我很难掌握如何获取Id值。

<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:apcm="http://ap.org/schemas/03/2005/apcm" xmlns:apnm="http://ap.org/schemas/03/2005/apnm" xmlns:georss="http://www.georss.org/georss">
    <id>urn:publicid:ap.org:30085</id>
<title type="xhtml">
    <apxh:div xmlns:apxh="http://www.w3.org/1999/xhtml">
        <apxh:span>AP New York State News - No Weather</apxh:span>
    </apxh:div>
</title>
<apcm:Property Name="FeedProperties">
    <apcm:Property Name="Entitlement" Id="urn:publicid:ap.org:product:30085" Value="AP New York State News - No Weather" />
    <apcm:Property Name="FeedSequencing">
            <apcm:Property Name="sequenceNumber" Id="169310964" />
            <apcm:Property Name="minDateTime" Value="2012-05-22T18:04:18.913Z" />
    </apcm:Property>
</apcm:Property>
<updated>2012-05-22T18:04:18.913Z</updated>
<author>
    <name>The Associated Press</name>
    <uri>http://www.ap.org</uri>
</author>
<rights>Copyright 2012 The Associated Press. All rights reserved. This material may not be published, broadcast, rewritten or redistributed.</rights>
<link rel="self" href="http://syndication.ap.org/AP.Distro.Feed/GetFeed.aspx?idList=30085&amp;idListType=products&amp;maxItems=20" />
<entry>
...
</entry>
</feed>

1 个答案:

答案 0 :(得分:0)

您必须注册命名空间,并使用[]谓词来标识您感兴趣的Property元素。如果您不使用双斜杠,这是最安全的,即,如果您从文件要素。

<?php

$xml = <<<EOD
...
EOD;

$sxe = new SimpleXMLElement($xml);

$sxe->registerXPathNamespace('apcm', 'http://ap.org/schemas/03/2005/apcm');
$sxe->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom');

$result = $sxe->xpath('/atom:feed/acpm:Property[@Name=\'FeedProperties\']/acpm:Property[@Name=\'FeedSequencing\']/acpm:Property[@Name=\'sequenceNumber\']/@Id');

foreach ($result as $sequenceNumber) {
  echo $sequenceNumber . "\n";
}

?>

请注意,理论上可能有多个同级Property元素具有相同的@Name,因此此Xpath可能会生成多个节点(@Id值)。