如何用命名空间解析XML?

时间:2015-07-18 12:20:37

标签: php xml parsing

这是我尝试使用PHP simplexml_load_string()函数类解析的xml文件,但它只打印</description>标记,并且不返回xml的其余部分

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dfpvideo="http://api.google.com/dfpvideo" xmlns:media="http://search.yahoo.com/mrss/" xmlns:ngc="http://xml.natgeotv.com/fields" xmlns:ngs="http://prod.ngs.org/ngs" xmlns:ngsDebug="http://prod.ngs.org/ngs-debug" xmlns:ngsTax="http://prod.ngs.org/taxonomy" xmlns:os="http://a9.com/-/spec/opensearch/1.1/" xmlns:pl="http://xml.theplatform.com/data/object" xmlns:pl1="http://access.auth.theplatform.com/data/Account/2388557369" xmlns:pl2="http://access.auth.theplatform.com/data/Account/2423130747" xmlns:pla="http://xml.theplatform.com/data/object/admin" xmlns:plfile="http://xml.theplatform.com/media/data/MediaFile" xmlns:pllist="http://xml.theplatform.com/data/list" xmlns:plmedia="http://xml.theplatform.com/media/data/Media" xmlns:plrelease="http://xml.theplatform.com/media/data/Release" xmlns:wpf="http://prod.ngs.org/wpf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ytcp="http://www.youtube.com/schemas/cms/2.0" version="2.0">
   <channel>
      <title>NG Video</title>
      <link>http://feed.theplatform.com/f/ngs/dCCn2isYZ9N9</link>
      <description>NG Video</description>
      <os:startIndex>1</os:startIndex>
      <os:itemsPerPage>100</os:itemsPerPage>
      <pllist:entryCount>1</pllist:entryCount>
      <item>
         <pl:id>http://data.media.theplatform.com/media/data/Media/97681476000</pl:id>
         <guid isPermaLink="false">a4ad87f6-cbe4-4816-9580-b6679af0ea73</guid>
         <title>NG Live!: Sheikh of the Arctic</title>
         <description>&lt;p&gt;Having completed more solo trips to the Poles than anyone else on the planet, Børge Ousland is sometimes surprised by who he runs into crossing the vast Arctic tundra.&lt;/p&gt;</description>
         <author />
         <media:keywords />
         <media:restriction relationship="deny" type="country" />
         <media:content channels="2" samplingrate="44.1" bitrate="535.928" medium="video" duration="175.031" expression="full" fileSize="11725511" framerate="29.97" type="video/mp4" height="346" isDefault="true" url="http://link.theplatform.com/s/ngs/ekLOLGt3bemU?feed=NG%20Video" width="616">
            <media:hash algo="md5">0AF4AD25977BF50888075D3547F67173</media:hash>
            <pl:added>Sun, 22 Dec 2013 02:41:46 GMT</pl:added>
            <plfile:assetType>mpeg4</plfile:assetType>
         </media:content>
         <media:thumbnail expression="full" fileSize="79478" type="image/jpeg" height="556" isDefault="false" url="http://pmdvod.nationalgeographic.com/NG_Video/997/323/67322_1_1280x720_990x556_177596483623.jpg" width="990">
            <media:hash algo="md5">60FFCE1C849440050CBCBD259EF2CE65</media:hash>
            <pl:added>Sun, 02 Mar 2014 05:26:41 GMT</pl:added>
            <plfile:assetType>Poster</plfile:assetType>
            <plfile:assetType>MED</plfile:assetType>
         </media:thumbnail>
         <media:thumbnail expression="full" fileSize="209762" type="image/jpeg" height="720" isDefault="false" url="http://pmdvod.nationalgeographic.com/NG_Video/997/323/67322_1_1280x720.jpg" width="1280">
            <media:hash algo="md5">08AC83096DC5F7E48A7CDE4BFA23A27A</media:hash>
            <pl:added>Sun, 02 Mar 2014 05:26:30 GMT</pl:added>
            <plfile:assetType>Mezzanine Image</plfile:assetType>
         </media:thumbnail>
         <media:thumbnail expression="full" fileSize="2962" type="image/jpeg" height="68" isDefault="false" url="http://pmdvod.nationalgeographic.com/NG_Video/997/323/67322_1_1280x720_120x68_177597507564.jpg" width="120">
            <media:hash algo="md5">605D86F9A2B606D97A653576E6CE99D2</media:hash>
            <pl:added>Sun, 02 Mar 2014 05:26:45 GMT</pl:added>
            <plfile:assetType>Thumbnail</plfile:assetType>
         </media:thumbnail>
         <media:thumbnail expression="full" fileSize="23707" type="image/jpeg" height="270" isDefault="false" url="http://pmdvod.nationalgeographic.com/NG_Video/997/323/67322_1_1280x720_480x270_177598019578.jpg" width="480">
            <media:hash algo="md5">73F78D0314E0CC15CDA5C36AAE4560AD</media:hash>
            <pl:added>Sun, 02 Mar 2014 05:26:42 GMT</pl:added>
            <plfile:assetType>Poster</plfile:assetType>
            <plfile:assetType>X-SM</plfile:assetType>
         </media:thumbnail>
         <media:thumbnail expression="full" fileSize="83905" type="image/jpeg" height="576" isDefault="false" url="http://pmdvod.nationalgeographic.com/NG_Video/997/323/67322_1_1280x720_1024x576_177598019579.jpg" width="1024">
            <media:hash algo="md5">5C4B05CE487697A63F4FEC8B51009497</media:hash>
            <pl:added>Sun, 02 Mar 2014 05:26:43 GMT</pl:added>
            <plfile:assetType>Poster</plfile:assetType>
            <plfile:assetType>LG</plfile:assetType>
         </media:thumbnail>
         <media:thumbnail expression="full" fileSize="114846" type="image/jpeg" height="720" isDefault="false" url="http://pmdvod.nationalgeographic.com/NG_Video/997/323/67322_1_1280x720_1280x720_177598019580.jpg" width="1280">
            <media:hash algo="md5">31BFBD1020B2277B7E6FDD353973F263</media:hash>
            <pl:added>Sun, 02 Mar 2014 05:26:43 GMT</pl:added>
            <plfile:assetType>Poster</plfile:assetType>
            <plfile:assetType>X-LG</plfile:assetType>
         </media:thumbnail>
         <media:thumbnail expression="full" fileSize="37132" type="image/jpeg" height="360" isDefault="true" url="http://pmdvod.nationalgeographic.com/NG_Video/997/323/67322_1_1280x720_640x360_177598019582.jpg" width="640">
            <media:hash algo="md5">2654AFBE193785E29FF0533CF977A473</media:hash>
            <pl:added>Sun, 02 Mar 2014 05:26:44 GMT</pl:added>
            <plfile:assetType>Poster</plfile:assetType>
            <plfile:assetType>SM</plfile:assetType>
         </media:thumbnail>
         <pubDate>Sat, 21 Dec 2013 06:56:49 GMT</pubDate>
         <plmedia:defaultThumbnailUrl>http://pmdvod.nationalgeographic.com/NG_Video/997/323/67322_1_1280x720_640x360_177598019582.jpg</plmedia:defaultThumbnailUrl>
         <plmedia:provider />
         <pl1:youTubeInStreamStandard>true</pl1:youTubeInStreamStandard>
         <pl1:youTubeInStreamTrueView>true</pl1:youTubeInStreamTrueView>
         <pl1:youTubeInVideo>true</pl1:youTubeInVideo>
         <pl1:youTubePublic>false</pl1:youTubePublic>
         <ngs:clipTypeOld>none</ngs:clipTypeOld>
         <ngs:contentCreationDate>Mon, 13 May 2013 19:03:22 GMT</ngs:contentCreationDate>
         <ngs:network>NGS</ngs:network>
         <ngs:redirectToExternal>never</ngs:redirectToExternal>
         <ngs:requiresAuth>false</ngs:requiresAuth>
         <ngs:series>{"updated_datetime":null,"creation_datetime":null,"is_active":false,"name":"National Geographic Live","translated_names":[],"synonyms":[],"uuid":null,"notes":null,"objectType":"org.ngs.video.Show","groups":[],"url":null}</ngs:series>
         <ngs:seriesName>National Geographic Live</ngs:seriesName>
         <ngsTax:location>{"updated_datetime":"2014-04-03T19:09:42.570Z","is_active":true,"creation_datetime":"2013-11-28T20:27:32.077Z","parent":"http://taxonomy.nationalgeographic.com/api/v1/locations/eea9ad49-32fc-3a7c-bf15-cfeabdaa2fb7","geonames_uri":null,"url":"http://taxonomy.nationalgeographic.com/api/v1/locations/ff4e742f-46e6-3867-be8c-003a7af8f86c","dbpedia_uri":"http://dbpedia.org/page/Arctic","name":"Arctic","longitude":0.0,"hierarchy":"earth/arctic/","latitude":0.0,"uuid":"ff4e742f-46e6-3867-be8c-003a7af8f86c","notes":"","objectType":"org.ngs.taxonomy.GeoLocation","groups":["Place","region"],"english_name":null,"parentName":"Earth"}</ngsTax:location>
         <ngsTax:location>{"updated_datetime":"2014-05-28T20:43:43.719Z","is_active":true,"creation_datetime":"2013-11-28T20:01:26.936Z","synonyms":[null,null],"parent":"http://taxonomy.nationalgeographic.com/api/v1/locations/eea9ad49-32fc-3a7c-bf15-cfeabdaa2fb7","geonames_uri":"http://sws.geonames.org/6697173/","url":"http://taxonomy.nationalgeographic.com/api/v1/locations/d2ce52aa-c6ac-3a13-9f8c-59cb13ecb924","dbpedia_uri":null,"name":"Antarctica","translated_names":[null],"longitude":16.40626,"hierarchy":"earth/antarctica/","latitude":-78.15856,"uuid":"d2ce52aa-c6ac-3a13-9f8c-59cb13ecb924","notes":"","objectType":"org.ngs.taxonomy.GeoLocation","groups":["Place","continent"],"english_name":null,"parentName":"Earth"}</ngsTax:location>
         <ngsTax:organization>{"updated_datetime":"2014-05-02T15:37:25.776Z","creation_datetime":"2013-11-28T19:40:52.694Z","is_active":true,"name":"National Geographic Live","synonyms":[null],"uuid":"bae34d69-0601-342b-abe4-345c4c2486c4","notes":"","objectType":"org.ngs.taxonomy.Organization","english_name":null,"groups":["Organization"],"url":"http://taxonomy.nationalgeographic.com/api/v1/organizations/bae34d69-0601-342b-abe4-345c4c2486c4"}</ngsTax:organization>
         <ngsTax:slug>ousland-sheikh-bonus-nglive</ngsTax:slug>
         <ngsTax:subject>{"updated_datetime":"2014-06-04T15:56:21.047Z","definition":"","is_active":true,"creation_datetime":"2013-11-28T19:59:40.956Z","scope_note":"","synonyms":[null],"parent":"http://taxonomy.nationalgeographic.com/api/v1/subjects/83bf00d5-93bd-3cca-acc3-543652f06d52","url":"http://taxonomy.nationalgeographic.com/api/v1/subjects/58f9272e-f37b-3550-a228-a5ee119553ae","name":"Explorers","hierarchy":"exploration/explorers/","uuid":"58f9272e-f37b-3550-a228-a5ee119553ae","notes":"","objectType":"org.ngs.taxonomy.Subject","groups":["Subject"],"english_name":null,"parentName":"Exploration"}</ngsTax:subject>
         <ngsTax:subject>{"updated_datetime":"2014-01-29T14:56:08.338Z","definition":"","is_active":true,"creation_datetime":"2013-11-28T19:52:45.402Z","scope_note":"","parent":"http://taxonomy.nationalgeographic.com/api/v1/subjects/83bf00d5-93bd-3cca-acc3-543652f06d52","url":"http://taxonomy.nationalgeographic.com/api/v1/subjects/83c5f238-8dbc-373e-9d62-4deb4c59e122","name":"Expeditions","hierarchy":"exploration/expeditions/","uuid":"83c5f238-8dbc-373e-9d62-4deb4c59e122","notes":"","objectType":"org.ngs.taxonomy.Subject","groups":["Subject"],"english_name":null,"parentName":"Exploration"}</ngsTax:subject>
         <ngsTax:subject>{"updated_datetime":"2014-02-10T19:47:37.384Z","definition":"","is_active":true,"creation_datetime":"2014-01-16T17:48:21.375Z","scope_note":"","synonyms":[null,null,null],"parent":"http://taxonomy.nationalgeographic.com/api/v1/subjects/a817863e-de0f-3ffd-944d-c75ed20308ff","url":"http://taxonomy.nationalgeographic.com/api/v1/subjects/f0c33fd8-5e31-36b2-9229-b71628df3367","name":"Travel","hierarchy":"travel-and-adventure/travel/","uuid":"f0c33fd8-5e31-36b2-9229-b71628df3367","notes":"","objectType":"org.ngs.taxonomy.Subject","groups":["Subject"],"english_name":null,"parentName":"Travel and Adventure"}</ngsTax:subject>
         <ngsTax:title>NG Live!: Sheikh of the Arctic</ngsTax:title>
         <wpf:allTaxonomyId>18160</wpf:allTaxonomyId>
         <wpf:allTaxonomyId>1589</wpf:allTaxonomyId>
         <wpf:allTaxonomyId>858</wpf:allTaxonomyId>
         <wpf:altLinkedLegacyUrl />
         <wpf:author />
         <wpf:firstPublishedTime>Mon, 13 May 2013 19:11:17 GMT</wpf:firstPublishedTime>
         <wpf:id>13615</wpf:id>
         <wpf:lastPublishedTime>Mon, 03 Feb 2014 21:50:20 GMT</wpf:lastPublishedTime>
         <wpf:lineupName>Nat Geo Live 2</wpf:lineupName>
         <wpf:locationMigration>Arctic</wpf:locationMigration>
         <wpf:locationMigration>Antarctica</wpf:locationMigration>
         <wpf:metaKeyword>Nat Geo Live</wpf:metaKeyword>
         <wpf:metaKeyword>Nat Geo Live!</wpf:metaKeyword>
         <wpf:metaKeyword>lecture</wpf:metaKeyword>
         <wpf:metaKeyword>National Geographic Live</wpf:metaKeyword>
         <wpf:metaKeyword>National Geographic Live!</wpf:metaKeyword>
         <wpf:metaKeyword>NGLive</wpf:metaKeyword>
         <wpf:metaKeyword>NG Live</wpf:metaKeyword>
         <wpf:metaKeyword>Nat Geo Events</wpf:metaKeyword>
         <wpf:metaKeyword>Børge Ousland</wpf:metaKeyword>
         <wpf:metaKeyword>polar</wpf:metaKeyword>
         <wpf:metaKeyword>adventure</wpf:metaKeyword>
         <wpf:metaKeyword>explore</wpf:metaKeyword>
         <wpf:metaKeyword>exploration</wpf:metaKeyword>
         <wpf:metaKeyword>expedition</wpf:metaKeyword>
         <wpf:metaKeyword>ski</wpf:metaKeyword>
         <wpf:metaKeyword>North Pole</wpf:metaKeyword>
         <wpf:metaKeyword>loneliness</wpf:metaKeyword>
         <wpf:metaKeyword>strange</wpf:metaKeyword>
         <wpf:metaKeyword>visitor</wpf:metaKeyword>
         <wpf:metaKeyword>ice</wpf:metaKeyword>
         <wpf:metaKeyword>photo</wpf:metaKeyword>
         <wpf:metaKeywords>Nat Geo Live, Nat Geo Live!, lecture, National Geographic Live, National Geographic Live!, NGLive, NG Live, Nat Geo Events, Børge Ousland, polar, adventure, explore, exploration, expedition, ski, North Pole, loneliness, strange, visitor, ice, photo</wpf:metaKeywords>
         <wpf:organizationMigration>National Geographic Live</wpf:organizationMigration>
         <wpf:sitePath>Specials Video::Nat Geo Live::Nat Geo Live 2</wpf:sitePath>
         <wpf:siteUrlPath>/video/specials/nat-geo-live-specials/nat-geo-live-2/ousland-sheikh-bonus-nglive/</wpf:siteUrlPath>
         <wpf:subjectMigration>Explorers</wpf:subjectMigration>
         <wpf:subjectMigration>Expeditions</wpf:subjectMigration>
         <wpf:subjectMigration>Travel</wpf:subjectMigration>
         <wpf:taxonomyId>18160</wpf:taxonomyId>
         <ytcp:youTubeAssetType>web</ytcp:youTubeAssetType>
         <ytcp:youTubeSavedMatchRights>Monetize in all countries</ytcp:youTubeSavedMatchRights>
         <ytcp:youTubeSavedUsageRights>Monetize in all countries</ytcp:youTubeSavedUsageRights>
      </item>
   </channel>
</rss>

这是我的代码

   function parsexml($xml)
   {
   $xmlparse=simplexml_load_string($xml)
   var_dump($xmlparse);
   }

1 个答案:

答案 0 :(得分:0)

您不会获得所有节点,因为它们使用名称空间,例如:pl:id。要解析这些,您可以使用Xpath。第一个示例抓取所有pl:added第二个获得media:hash

如果您知道文件将始终使用相同的前缀,则只能使用以下内容。如果没有,则必须为您使用的每个simpleXMLElement对象注册名称空间。

<?    
$str = '*your string here*';    
$xml = simplexml_load_string($str);

// to get pl:added 
foreach($xml->xpath('//media:content') as $element) {
    $added = $element->xpath('//pl:added');
}
//output $added
echo "<pre>";
var_dump($added);

// to get media:hash
foreach($xml->xpath('//media:thumbnail') as $element) {
    $hash = $element->xpath('//media:hash');
}
//output $hash
echo "<pre>";
var_dump($hash);
?>

当您需要注册名称空间时,您可以执行以下操作。首先,您可以转储名称空间,以便知道需要使用哪个URL。

["os"]=>string(36) "http://a9.com/-/spec/opensearch/1.1/"所以对于操作系统你需要那个网址。

<?    
$str = '*your string here*';    
$xml = simplexml_load_string($str);

// to get the namespaces uncomment the next 3 lines
// $namespaces = $xml->getNamespaces(true);
// echo "<pre>";
// var_dump($namespaces);

$xml->registerXPathNamespace('media', 'http://search.yahoo.com/mrss/');

foreach($xml->xpath('//media:content') as $element) {
    $element->registerXPathNamespace('pl', 'http://xml.theplatform.com/data/object');
    $added = $element->xpath('//pl:added');
}

echo "<pre>";
var_dump($added);

$xml->registerXPathNamespace('media', 'http://search.yahoo.com/mrss/');

foreach($xml->xpath('//media:thumbnail') as $element) {
    $element->registerXPathNamespace('media', 'http://search.yahoo.com/mrss/');
    $hash = $element->xpath('//media:hash');
}

echo "<pre>";
var_dump($hash);
?>
相关问题