2017-06-27 54 views
1

我知道如何通過使用simplexml進行解析來調用.xml文檔中的子項,但是我在調​​用具有如下所示名稱的子項時遇到問題:名2。如何使用simplexml在名爲simplexml中回顯xml中的子項

更具體地說,我試圖從這個.xml文檔回顯nhc:center:http://www.nhc.noaa.gov/nhc_ep4.xml

目前我的代碼看起來是這樣的:

<?php 
$xml=simplexml_load_file("http://www.nhc.noaa.gov/nhc_ep4.xml") or die("Error: Cannot create object"); 
echo $xml->channel->title[0] . "<br>"; 
echo $xml->channel->description[0] . "<br><br>"; 
echo $xml->channel->item[0]->nhc:Cyclone->nhc:center . "<br>"; 
?> 

前三行很好地工作,但是我回到試圖調用NHC當這個錯誤:中心:

Parse error: syntax error, unexpected ':', expecting ',' or ';' in C:\xampp\htdocs\test.php on line 5

我敢肯定,這簡單的東西我在這裏想念,任何幫助非常感謝!

回答

0

編輯2

後,這個答案被接受的一天,一少「哈克」的答案在這裏貼:https://stackoverflow.com/a/44813107/713874

原答覆

嘗試在大括號和引號包裹的名字,如:

echo $xml->channel->item[0]->{'nhc:Cyclone'}->{'nhc:center'} . "<br>"; 

來源: How do I access this object property with a hyphenated name?

編輯:我注意到你的域名都是公衆看到它仍然沒有抓住你的信息。奇怪的。我沒有找到這個工作,圍繞解決它:

$xml = simplexml_load_string(str_replace("nhc:", "nhc", file_get_contents("http://www.nhc.noaa.gov/nhc_ep4.xml")));

+0

這當然除去錯誤,但回聲$ XML->通道 - >項[0] - > { 'NHC:旋風'} - > { 'NHC:中心'}。 「
」;現在不會返回任何值 – USTropics

+1

這完全是一個新問題,但我會先從:var_dump($ xml-> channel)''得到什麼? – Bing

+1

@人性我能夠重現您的問題,並通過解決方案更新我的答案。 – Bing

0

冒號不是赤裸裸的對象有效的屬性名稱,所以你必須說出來了:

$xml->channel->item[0]->{'nhc:Cyclone'}->{'nhc:center'} 
+0

一個':'在XML標籤表示命名空間,而不是元素名稱的一部分,因此這不會給正確的值。相反,您需要使用' - > children()'方法來選擇正確的名稱空間。 – IMSoP

-1

這已經被問數百次,但答案往往是誤導或過具體的,所以,因爲我無法找到一個很好的典型答案將其標記爲重複,這裏是另一個總結:

  • 標籤名稱中的冒號(:)表示該標籤位於「名稱空間」中。
  • 冒號前的部分是「命名空間前綴」;它對本文件是本地的,並且如果沒有文件改變的含義(例如,如果文件是由不同的應用程序生成或處理的話)可以在沒有通知的情況下改變。
  • 將「名稱空間標識符」映射到此文件頂部的xmlns屬性,並將其格式化爲URL。 URL並沒有指向任何地方,這只是某人「擁有」命名空間的一種方式。
  • 在這種情況下xmlns:nhc="http://www.nhc.noaa.gov"前綴nhc:映射到命名空間http://www.nhc.noaa.gov
  • SimpleXML中,你訪問元素使用the ->children() method命名空間,並且在使用the ->attributes() method一個命名空間屬性。當您使用->foo['bar']等時,這些「切換」您正在查看的名稱空間。
  • 您可以使用前綴作爲參數傳遞給->children()->attributes(),但正如我所說,這可能會改變,所以我通常做的是設置爲網址恆定的地方,所以我有我自己的短標識符,它和唐不必將URL粘貼到多個位置。

長話短說,你需要寫:

// Define a constant to refer to the namespace 
// could be a variable, a class constant, or whatever you like 
define('XMLNS_NHC', 'http://www.nhc.noaa.gov'); 

// Use ->children() to switch to that namespace 
echo $xml->channel->item[0]->children(XMLNS_NHC)->Cyclone->center;