1

APIを使用して、検索クエリの結果を表示しています。

出力は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()を呼び出す

私はこれについて数日以上解決策を探しています。

4

3 に答える 3

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を登録することにより、それらを使用することで、作業をより簡単にすることができます。

于 2013-03-04T08:36:41.890 に答える
1

$ xmlには何がありますか?結果を印刷できますか。そしてそれが何も含まれていない場合

次に、問題は名前空間にあります。次の質問を見てください 。PHPを使用してXMLから名前空間を削除します。

$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]);
于 2013-03-04T08:36:59.397 に答える
1

最後に、DOMを介して答えを見つけることができました。

@Deepak Srinivasan : 実行する前に名前空間を登録するという提案を試みましたが、それを乗り越えることができませんでした。続行方法がわからない可能性があります。

@m4t1t0: 返信ありがとうございます。

ファイル全体のペーストビンの 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項目が完全に 1 つの段落として取得されます。

しかし、テキスト内で foreach を使用すると、最初のli項目のみが取得されます。

Text ulに対しても foreach を試しまし たが、結果は 1 つしかありません。

助言がありますか..

どうもありがとう。

于 2013-03-05T03:58:02.640 に答える