2013-05-01 79 views
2

它是我第一次使用XML文件,並且使用SimpleXML。使用簡單的XML獲取XML值

我覺得$xml->dni-listings->get-listings-by-day->current->date有可能嗎?但我不知道該怎麼做。目前,我設法做到這一點的唯一方法是使用以下代碼。但是我發現它太長時間以來就會變得更加簡單?

我的XML文件是在這裏http://www.dmax.it/tvl-fe/day/?type=day&channel_code=DXIT-IT&filter=1130&date=01052013

enter image description here

$file = file_get_contents ('http://www.dmax.it/tvl-fe/day/?type=day&channel_code=DXIT-IT&filter=1130&date=01052013'); 
$xml = new SimpleXMLElement ($file); 

foreach($xml->children()->children() as $child) 
    { 
    echo $child->getName() . "<br />"; 
    if ('current' == $child->getName()){ 
     echo $child->date . "<br />"; 
    } 
} 
+0

只是一些參考(我見過你這麼遠來解決它已經但它仍然可以是有趣的):使用XML節點名稱與PHP連字符(http://stackoverflow.com/q/3634599/367456)和着名的[* SimpleXML基本用法示例*](http://php.net/simplexml.examples-basic) – hakre 2013-05-01 18:05:10

回答

1

好,大量的試驗和錯誤後,我找到了解決辦法。

顯然有幾種方法可以通過調用children()來獲得子元素,然後這將提供該級別的所有兒童。

這是我得到了date

$xml->children()->children()->current->date; 

和連字符屬性,這是我訪問他們:

$xml->children()->children()->{'previous-date'}->formatted; 

而且我發現這樣做

的這個其他方式
$namespacesMeta = $xml->getNamespaces(true); 
$xml->children(@$namespacesMeta['dni-listings'])->children(@$namespacesMeta['get-listings-by-day'])->children(@$namespacesMeta['current'])->date; 

我把變量放在@之前,因爲其他的智能我得到這個Notice: Undefined index: get-listings-by-day in C:\xampp\htdocs\test.php on line 8但是這是我原來的問題,這樣做

問題的另一種方式是由於這樣的事實:事情是連字符和我的路徑應該更像

$xml->{'get-listings-by-day'}->current->date 
+1

您會收到警告,因爲沒有這些命名空間。而不是隱藏警告('@'-operator),修復原因;)不要使用沒有名稱空間的地方;) – hakre 2013-05-01 18:06:46

1

$xml本身就代表根節點,你的情況<dni-listings>,所以離開,一出路徑:

$dates = $xml->{'get-listings-by-day'}->current->date 

會給你的日期。顯示所有日期:

foreach ($dates as $date) echo $date; 

看到它的工作:http://codepad.viper-7.com/xTyeML

+0

爲什麼選擇投票? – michi 2013-05-01 14:38:12

+0

你的答案似乎合法。它還顯示了Jonathan如何壓縮代碼並防止他在這裏錯誤地使用名稱空間(因爲文檔中根本沒有名稱空間)。 Counter upvote已解鎖。 – hakre 2013-05-01 18:04:36

0

需要注意的是XML ::簡單,不建議新的應用程序。

我使用Perl的哈希訪問項目。對於簡單的情況下,我使用:

$xml = new SimpleXMLElement ($file, keyattr => []); 
$xml->{dni-listings}->{get-listings-by-day}->{current}->{date}; 

如果你想要寫XML退了出來,而不是把它摺疊東西 像成一個單一的標籤,您可能需要使用 的ForceArray選項。這有點困難,但效果很好。

$xml = new SimpleXMLElement ($file, ForceArray => 1, keyattr => []); 
$xml->{dni-listings}[0]->{get-listings-by-day}[0]->{current}[0]->{date}[0];