2013-03-04 285 views
1

我使用API​​來顯示結果w.r.t以搜索查詢。使用PHP讀取XML屬性

輸出將採用XML形式,我需要解析XML並在瀏覽器中顯示結果。

該文件包含許多屬性,我不知道如何提取結果。

這裏是我的代碼:

<?xml version="1.0" ?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
<S:Body> 
<ns3:tourDetailsFullResponse xmlns:ns2="http://example.com/" xmlns:ns3="http://example.com/" xmlns:ns4="http://www.example.com/"> 

<ns4:MarketLocalisedTourData SellingCompanyCode="CODE1" OperatingProductCode="CODE2" MarketVariationCode="CODE3" Duration="8" Currency="USD" CatalogueCode="CODE4" TropicsBrochureCode="CODE5" BrandCode="CODE6" BookableOnline="true"> 

<ns4:TourInfo> 
<ns4:TourName>London to Rome Highlights 2013</ns4:TourName> 
<ns4:Metadata> 
    <ns4:TourCategories> 
     <ns4:TourCategory Name="TourStyles"> 
      <ns4:CategoryValue Name="European Discoveries"/> 
     </ns4:TourCategory> 
    </ns4:TourCategories> 
    <ns4:Brochures> 
     <ns4:Brochure Name="CostSaver 2013" Code="CODE1"/> 
    </ns4:Brochures> 
</ns4:Metadata> 
<ns4:ContinentsVisited> 
    <ns4:Continent Name="Europe" Code="EURO"/> 
</ns4:ContinentsVisited> 
<ns4:CountriesVisited> 
    <ns4:Country Name="France" Continent="EURO" Code="FR"/> 
    <ns4:Country Name="United Kingdom" Continent="EURO" Code="GB"/> 
    <ns4:Country Name="Italy" Continent="EURO" Code="IT"/> 
    <ns4:Country Name="Switzerland" Continent="EURO" Code="CH"/> 
</ns4:CountriesVisited> 
<ns4:LocationsVisited> 
    <ns4:Location Name="Paris" Country="FR"/> 
    <ns4:Location Name="Dover" Country="GB"/> 
    <ns4:Location Name="London" Country="GB"/> 
    <ns4:Location Name="Rome" Country="IT"/> 
    <ns4:Location Name="Calais" Country="FR"/> 
    <ns4:Location Name="Venice" Country="IT"/> 
    <ns4:Location Name="Lucerne" Country="CH"/> 
    <ns4:Location Name="Florence" Country="IT"/> 
</ns4:LocationsVisited> 
<ns4:Description>A lively journey through elegant Paris, gorgeous Lake Lucerne, charming Venice and cultural Florence, bookended by stays in London and legendary Rome. Spend a day at leisure in London and get the best views of Rome from high up in St. Peter’s Basilica before throwing a lucky coin in Trevi Fountain.</ns4:Description> 
<ns4:Assets> 
    <ns4:Image Width="297" Url="http://www.example.com/imageurl" Type="map" Name="route_map" Height="297" Caption="route_map"/> 
    <ns4:Image Width="600" Url="http://www.example.com/imageurl" Type="map" Name="route_map" Height="600" Caption="route_map"/> 
    <ns4:Image Width="531" Url="http://www.example.com/imageurl" Type="photo" Name="primary_image" Height="531" Caption="primary_image"/> 
    <ns4:Image Width="125" Url="http://www.example.com/imageurl" Type="photo" Name="primary_image" Height="125" Caption="primary_image"/> 
</ns4:Assets> 
    ....continues 

現在我想提取大陸參觀,訪問的國家,走訪地點,行程,租入資產價值等等

我試圖用簡單的XML像下面

$feed = "response1_full.xml"; 

$xml = simplexml_load_file($feed); 

print_r($xml); 

foreach($xml->LocationsVisited[0]->attributes() as $a => $b) { 
    echo $a,'="',$b,"\"\n"; 
} 
also tried 
foreach($xml->TourInfo->LocationsVisited[0]->attributes() as $a => $b) { 
    echo $a,'="',$b,"\"\n"; 
} 

也嘗試導致同樣的錯誤

所有其他的可能性

Fatal error: Call to a member function attributes() on a non-object in C:\xampp\htdocs\test\xmlread2.php on line 10

我在這兩天以上尋找解決方案。

+0

您尋找的解決方案意味着您瞭解XML中的命名空間以及[如何使用simplexml訪問命名空間元素](http://stackoverflow.com/search?q=how+to+access+namespaced+elements+與+ simplexml的)。所以請環顧四周,看看你的問題是否曾被問過。提問並回答你自己的問題也是可以的。 – hakre 2013-03-05 14:11:11

回答

2

如果你想穿越到孩子們在自己的命名空間,你要告訴的SimpleXMLElement其命名空間:

$ns4 = $xml->children('S', true)->Body 
     ->children('ns3', true)->tourDetailsFullResponse 
      ->children('ns4', true); 

$locations = $ns4->MarketLocalisedTourData->TourInfo->LocationsVisited->Location; 

foreach ($locations as $location) { 
    $attributes = $location->attributes(); 
    echo $attributes['Name']; 
    echo $attributes['Country']; 
} 

但是你可以通過使用xpath with the namespace(s) you're interested in by registering them您的生活更輕鬆。

+0

我試過你的suggesstion,導致'Warning:提供的foreach()在第10行的C:\ xampp \ htdocs \ test \ xmlread2.php中存在無效參數' – vijay 2013-03-04 08:54:06

+0

對不起,我忘記了包含TourInfo – m4t1t0 2013-03-04 09:00:39

+0

其實我也試過,但結果沒有變化。 獲取相同的錯誤。 – vijay 2013-03-04 09:16:06

1

$ xml有什麼?你能打印結果嗎? 如果它不包含任何東西

那麼問題是命名空間 看看他以下問題: Remove namespace from XML using PHP

$feed = "response1_full.xml"; 
echo "<pre>"; 
$sxe = simplexml_load_file($feed); 
if ($sxe === false) { 
echo "Failed loading XML\n"; 
foreach(libxml_get_errors() as $error) { 
    echo "\t", $error->message; 
} 
} 
if (file_exists('response1_full.xml')) { 
$xml = simplexml_load_file('response1_full.xml'); 
//print_r($xml); 
} else { 
exit('Failed to open test.xml.'); 
} 
print_r($sxe->Body->tourDetailsFullResponse->MarketLocalisedTourData->TourInfo->LocationsVisited->Location[0]); 
print_r($sxe->Body->tourDetailsFullResponse->MarketLocalisedTourData->TourInfo->LocationsVisited->Location[1]); 
+0

如果我打印$ xml,我會得到以下回答: 'SimpleXMLElement Object()' 而且我已經將該文件保存在該名稱下,爲什麼要將該文件作爲字符串加載並再次保存XML!對不起,我不明白.. – vijay 2013-03-04 08:51:56

+0

問題是你的命名空間從標籤中刪除命名空間和相應的namespce,看看你是否得到任何輸出 – 2013-03-04 09:11:35

+0

當我刪除名稱空間,並試圖評估它的對象時,你的問題是與命名空間 – 2013-03-04 11:08:24

1

最後我設法找到通過DOM答案。

@Deepak Srinivasan:我試過你的建議,在執行前註冊命名空間,但我沒有克服它,可能我不知道如何繼續。

@ m4t1t0:謝謝你的迴應。

我已粘貼完整文件的pastebin url,您可以從答案下方指定的URL中看到該文件。

我使用getAttribute方法

$doc = new DOMDocument(); 
$doc->load('response1_full.xml'); 

//tourname 
$tname = $doc->getElementsByTagName("TourName"); 
$tourname = $tname->item(0)->nodeValue; 
echo $tourname; 
//locations visited 
$locations = $doc->getElementsByTagName("Location"); 
foreach($locations as $location) 
{ 

    $locationname = $location->getAttribute('Name'); 
    $locationcountry = $location->getAttribute('Country'); 

    echo $locationname.'-'.$locationcountry.'<br>'; 
} 

這正是打印出所需的詳細信息的解決方案。

但現在我在同一個文件中有一個小小的疑問, 我有一些嵌套格式的信息,有沒有反正我可以很容易地將它拉出來。

這是我對於 http://pastebin.com/iWQf6j4K

Insde的文件,你可以看到一個部分

<ns4:WhatsIncluded> 

其中有標題和文本文件(UL - 李格式)

有什麼辦法我可以把這個區域內的數據拉出來。 如果我從文本拉動下數據我得到的項目完全是一個段落,

但是當我使用的foreach內文本我只得到了第一項目,

我也嘗試過foreach for Textul,但仍然只有一個結果。

任何建議..

非常感謝。