2012-11-01 159 views
-1

它是重複的,只是不適用於已關閉的問題。 終於找到了答案,即使在這裏。 實際重複:PHP SimpleXML Namespace ProblemSimpleXML PHP解析

編輯:如果你仔細閱讀這個問題,你會發現它不是PHP namespace simplexml problems的重複。 「可能重複」的答案不是我的問題的答案。

還是那句話:
我都沒有問題$value = $record->children('cap', true)->$title;(這是所有「可能重複的答案)
我有當有與結腸,在標籤內的其它標籤的問題。

<tag:something>hello</tag:something> //I parse out hello (this is the 'duplicate questions' answer that I don't need answered) 

<tag:something> 
<stuff>hello</stuff> //I cannot grab this. Explanation below. 
</tag:something> 

編輯結束。

原題:
我不能得到數據的標記<value>內部在位於http://alerts.weather.gov/cap/us.php?x=1(以下XML的樣本)的XML。

的問題是:

$array[] = $record->children($tag_cap, true)->$tag_geocode->$tag_value;

這是我不能搶,我已經驗證了比所有其他$array[4]其他數據被抓住的唯一數據。

當父標籤的格式爲<cap:something>時,從標籤獲取數據時出現問題。例如:

當它像<cap:something>100</cap:something>時,我可以得到100。但是如果它像<cap:something><value>100</value></cap:something>那樣我不能得到100。

一塊XML的:

<?xml version = '1.0' encoding = 'UTF-8' standalone = 'yes'?> 

<feed 
xmlns = 'http://www.w3.org/2005/Atom' 
xmlns:cap = 'urn:oasis:names:tc:emergency:cap:1.1' 
xmlns:ha = 'http://www.alerting.net/namespace/index_1.0' 
> 
<!-- http-date = Tue, 30 Oct 2012 06:34:00 GMT --> 

<id>http://alerts.weather.gov/cap/us.atom</id> 
<logo>http://alerts.weather.gov/images/xml_logo.gif</logo> 
<generator>NWS CAP Server</generator> 
<updated>2012-10-30T14:34:00-04:00</updated> 
<author> 
<name>[email protected]</name> 
</author> 
<title>Current Watches, Warnings and Advisories for the United States Issued by the National Weather Service</title> 
<link href='http://alerts.weather.gov/cap/us.atom'/> 

<entry> 
<id>http://alerts.weather.gov/cap/wwacapget.php?x=AK124CCADA8120.BlizzardWarning.124CCAE7BFC0AK.AFGWSWNSB.d32adb45b5c82ec5e486c4cfb96d3fb6</id> 
<updated>2012-10-30T05:20:00-08:00</updated> 
<published>2012-10-30T05:20:00-08:00</published> 
<author> 
<name>[email protected]</name> 
</author> 
<title>Blizzard Warning issued October 30 at 5:20AM AKDT until October 31 at 6:00AM AKDT by NWS</title> 
<link href='http://alerts.weather.gov/cap/wwacapget.php?x=AK124CCADA8120.BlizzardWarning.124CCAE7BFC0AK.AFGWSWNSB.d32adb45b5c82ec5e486c4cfb96d3fb6'/> 
<summary>...BLIZZARD WARNING IN EFFECT UNTIL 6 AM AKDT WEDNESDAY... THE NATIONAL WEATHER SERVICE IN FAIRBANKS HAS ISSUED A BLIZZARD WARNING...WHICH IS IN EFFECT UNTIL 6 AM AKDT WEDNESDAY. * VISIBILITY...NEAR ZERO IN SNOW AND BLOWING SNOW. * WINDS...WEST 35 MPH GUSTING TO 50 MPH. * SNOW...ACCUMULATION 3 INCHES THROUGH TONIGHT.</summary> 
<cap:event>Blizzard Warning</cap:event> 
<cap:effective>2012-10-30T05:20:00-08:00</cap:effective> 
<cap:expires>2012-10-30T16:00:00-08:00</cap:expires> 
<cap:status>Actual</cap:status> 
<cap:msgType>Alert</cap:msgType> 
<cap:category>Met</cap:category> 
<cap:urgency>Expected</cap:urgency> 
<cap:severity>Severe</cap:severity> 
<cap:certainty>Likely</cap:certainty> 
<cap:areaDesc>Eastern Beaufort Sea Coast</cap:areaDesc> 
<cap:polygon></cap:polygon> 
<cap:geocode> 
<valueName>FIPS6</valueName> 
<value>002185</value> 
<valueName>UGC</valueName> 
<value>AKZ204</value> 
</cap:geocode> 
<cap:parameter> 
<valueName>VTEC</valueName> 
<value>/X.NEW.PAFG.BZ.W.0013.121030T1320Z-121031T1400Z/</value> 
</cap:parameter> 
</entry> 

...//rest of XML... 

PHP代碼:

ini_set('display_errors','1'); 

$alert_url = 'http://alerts.weather.gov/cap/us.php?x=1'; 

$alert_string_xml = file_get_contents($alert_url); 

$alert_simple_xml_object = simplexml_load_string($alert_string_xml); 

$count = 0; 

$tag_entry = 'entry'; 
$tag_summary = 'summary'; 
$tag_cap = 'cap'; 
$tag_event = 'event'; 
$tag_certainty = 'certainty'; 
$tag_areaDesc = 'areaDesc'; 
$tag_geocode = 'geocode'; 
$tag_value = 'value'; 

foreach ($alert_simple_xml_object->$tag_entry as $record) 
{ 
    $count++; 

    $array = array(); 
    $array[] = $record->$tag_summary; 
    $array[] = $record->children($tag_cap, true)->$tag_event; 
    $array[] = $record->children($tag_cap, true)->$tag_certainty; 
    $array[] = $record->children($tag_cap, true)->$tag_areaDesc; 
    $array[] = $record->children($tag_cap, true)->$tag_geocode->$tag_value; 
    //$array[] = $record->children($tag_cap, true)->$tag_geocode->$tag_value[0]; //doesnt work either 


    echo $array[4]; //nothing is echoed 

} 

MOST當前的嘗試:
我閱讀更多的命名空間,並更好地瞭解他們。我甚至嘗試了我認爲是一個更好的解決方案:

//inside the above foreach loop 
    $namespaces = $record->getNameSpaces(true); 
    $caap = $record->children($namespaces['cap']); 
    echo $caap->event; //works (but the first way works too) 
    echo $caap->geocode->value; //(STILL does not work. Nothing is echoed) 

我不明白爲什麼我不能搶來自具有包括命名空間的父標籤孩子標籤的任何數據。

+1

'children()'不是PHP函數。你不能調用未定義的函數。因此你的代碼被破壞了。請更正它,以便更清楚您嘗試過的內容。 – hakre

+0

孩子是SimpleXML的功能正確嗎?我爲這個問題添加了一些信息。 – Ryan

+0

是的,它是'SimpleXMLElement'的一種方法,參見http://php.net/simplexmlelement.children – hakre

回答

0

cap:stuff是根,這樣你就可以訪問要素:

$xml = simplexml_load_string($your_xml); 
$value_name_0 = $xml->valueName[0]; 
$value_0 = $xml->value[0]; 
$value_name_1 = $xml->valueName[1]; 
$value_1 = $xml->value[1]; 
+0

對不起,我的問題沒有足夠的信息。我編輯了這個問題。 – Ryan

+0

無論如何,我答案中的代碼都可以做到。 – doublesharp

+0

它沒有。沒有任何迴音。 – Ryan

0

您可能正在尋找this功能。有兩個例子,這應該足以解決你的問題

+0

謝謝,我會嘗試。 – Ryan

0

如果有錯誤和警告,你所面臨的問題不在於可見禁用:

命名空間錯誤:在東西命名空間前綴蓋不定義

如果您將有錯誤使您能看到該消息。由於simplexml無法正確解析名稱空間前綴cap,因此它將被丟棄。

因此您可以直接訪問它:

$xml->stuff->value[1] 

與同類。考慮下面的代碼示例(demo

$xml = simplexml_load_string('<entry> 
<cap:stuff> 
    <valueName>aaa</valueName> 
    <value>000</value> 
    <valueName>bbb</valueName> 
    <value>111</value> 
</cap:stuff> 
</entry>'); 

echo "\nResult:", $xml->stuff->value[1], "\n\n"; 
echo "XML:\n", $xml->asXML(); 

它通過輸出其加載XML字符串後證明了的錯誤信息,以及什麼是$xml

Warning: simplexml_load_string(): namespace error : Namespace prefix cap on \ 
            stuff is not defined on line 10 
Warning: simplexml_load_string(): <cap:stuff> on line 10 
Warning: simplexml_load_string():   ^on line 10 

Result:111 

XML: 
<?xml version="1.0"?> 
<entry> 
<stuff> 
    <valueName>aaa</valueName> 
    <value>000</value> 
    <valueName>bbb</valueName> 
    <value>111</value> 
</stuff> 
</entry> 

如果你聞到的東西應該工作但它不是,總是需要仔細觀察一下,其中一個選項是再次將字符串作爲XML再次回顯以查看simplexml已解析的內容,另一個選項是啓用錯誤報告並查找警告和錯誤,它們通常包含更多信息。

+0

我有錯誤,我沒有得到那個錯誤。我會再次更新我的問題,正是我所做的。我試圖讓這個問題容易理解,但它確實使問題更難回答。 – Ryan

+0

是的,的確,寫一個好問題並不容易。 **編輯:**對於錯誤報告,你錯過了'error_reporting(〜0);'所以你看到所有的警告和通知。 – hakre

+0

唉,仍然沒有錯... – Ryan