2013-03-04 2 views
1

Я использую API для отображения результатов w.r.t для поиска запроса.Чтение атрибутов XML с использованием PHP

Результат будет в форме 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 

Теперь я хочу, чтобы извлечь континенты посетили страны посетили, посещенные места, маршрут, assests и т.д. ...

Я попытался с помощью простого 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

ответ

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

Я пробовал ваше предложение, которое приводит к 'Предупреждению: неверный аргумент, предоставленный foreach() в C: \ xampp \ htdocs \ test \ xmlread2.php в строке 10' – vijay

+0

Извините, я забыл включить TourInfo – m4t1t0

+0

На самом деле я попытался включить это тоже но никаких изменений в результате. Получение такой же ошибки. – vijay

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

+0

проблема с вашим пространством имен удаляет пространство имен и соответствующие namespce из тегов и, если вы получаете какой-либо вывод –

+0

, ваша проблема связана с пространством имен, когда я удалил пространства имен и попытался оценить объект, с которым он работал –

1

Наконец мне удалось найти ответ через DOM.

@Deepak Srinivasan: Я пробовал ваши предложения по регистрации пространства имен перед выполнением, но я не справился с этим, может быть, я не уверен, как действовать дальше.

@ m4t1t0: Благодарим за отзыв.

Я наклеил пастообразный 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> 

, который имеет название и текст (уль - формат ли)

Есть ли способ Я могу вытащить данные внутри этого сериала. если я извлечение данных из Текста под Разделом я получаю Li элементов полностью в одном абзаце,

но когда я использую Еогеасп внутри Текста я получаю только первый лития элемент,

Я также пробовал foreach для Текстul, но все же только один результат.

Любые предложения ..

Большое спасибо.

Смежные вопросы