我正在使用API将结果显示为w.r.t以搜索查询。
输出将以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";
}
还尝试了导致相同错误的所有其他可能性
致命错误:在第10行的C:\ xampp \ htdocs \ test \ xmlread2.php中调用非对象的成员函数attributes()
我正在寻找一个解决方案超过几天。
答案 0 :(得分: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可以让您的生活更轻松。
答案 1 :(得分: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]);
答案 2 :(得分: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
在文件中输入您可以看到的部分
<ns4:WhatsIncluded>
有标题和文字(ul - li格式)
有什么方法可以在这个部分内拉数据。 如果我从部分下的文字中提取数据,我将 li 项完全作为一个段落,
但是当我在文字中使用foreach时,我只获得第一个 li 项目,
我还尝试使用文字 ul ,但仍然只有一个结果。
任何建议..
非常感谢。