0

BING からの応答として次の XML 文字列を取得します (注:COMPOSITE 結果)。エントリ (インライン -> フィード -> エントリ) を for ループにスキャンしようとしましたが、失敗しました.スキャンに使用したコード以下のような結果

$xml = new SimpleXMLElement($rs);
$i=0;       
if ( $xml->entry->link ) {
    $feeds = $xml->entry->link->children('m', TRUE)->inline->entry;
    foreach ( $feeds as $results) {
        $i++;
        echo $data=(string)$results->content;
        $result = $data->children('m', TRUE)->properties->children('d', TRUE);
        echo "ss".$clickurl = $result->Url;
        $url = urldecode($clickurl);
        $search[$i]['url'] = str_replace("&", "&", $url);// for the vali
        $search[$i]['abstract'] = (string)$result->Description;
        $search[$i]['title']    = (string)$result->Title;
        $search[$i]['rank'] = $i;   
    } //foreach 
}
return $search;

*ここで私が見逃しているものを教えてもらえますか? <m:inline> <feed>simpleXML オブジェクトを使用してデータセットにアクセスする方法がわかりません。Microsoft サポート チームの回答は、PHP は彼らの言語ではないため、私を助けることはできません。フォーラム/スタック オーバーフローを使用するように依頼してください。*

   <feed xmlns:base="https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Composite" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title type="text">keyword</title>
  <subtitle type="text">Bing Search API</subtitle>
  <id>https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Composite?Query='keyword'</id>
  <rights type="text" />
  <updated>2012-08-07T18:29:09Z</updated>
  <entry>
    <id>https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Composite?Query='keyword'&amp;$skip=0&amp;$top=1</id>
    <title type="text">ExpandableSearchResult</title>
    <updated>2012-08-07T18:29:09Z</updated>
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Web" type="application/atom+xml;type=feed" title="Web" href="ExpandableSearchResultSet(guid'3947df4e-b3b3-4be7-b25b-77852c8d312a')/Web">
      <m:inline>
        <feed xmlns:base="https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/ExpandableSearchResultSet(guid'3947df4e-b3b3-4be7-b25b-77852c8d312a')/Web" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
          <title type="text">Web</title>
          <subtitle type="text">Bing Search API</subtitle>
          <id>https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/ExpandableSearchResultSet(guid'3947df4e-b3b3-4be7-b25b-77852c8d312a')/Web</id>
          <rights type="text"></rights>
          <updated>2012-08-07T18:29:09Z</updated>
          <link rel="next" href="https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/Web?Query='keyword'&amp;$skip=3&amp;$top=50" />
          <entry>
            <id>https://api.datamarket.azure.com/Data.ashx/Bing/SearchWeb/ExpandableSearchResultSet(guid'3947df4e-b3b3-4be7-b25b-77852c8d312a')/Web?$skip=1&amp;$top=1</id>
            <title type="text">WebResult</title>
            <updated>2012-08-07T18:29:09Z</updated>
            <content type="application/xml">
              <m:properties>
                <d:ID m:type="Edm.Guid">a6c62628-0012-42a2-b65c-513c82f523d1</d:ID>
                <d:Title m:type="Edm.String">title ...</d:Title>
                <d:Description m:type="Edm.String">title: ...</d:Description>
                <d:DisplayUrl m:type="Edm.String">sss.newikis.com/dd.html</d:DisplayUrl>
                <d:Url m:type="Edm.String">http://ss.newikis.com/ss.html</d:Url>
              </m:properties>
            </content>
          </entry>
        </feed>
      </m:inline>
    </link>
    <content type="application/xml">
      <m:properties>
        <d:ID m:type="Edm.Guid">3947df4e-b3b3-4be7-b25b-77852c8d312a</d:ID>
        <d:WebTotal m:type="Edm.Int64">3</d:WebTotal>
        <d:WebOffset m:type="Edm.Int64">0</d:WebOffset>
        <d:AlteredQuery m:type="Edm.String"></d:AlteredQuery>
        <d:AlterationOverrideQuery m:type="Edm.String"></d:AlterationOverrideQuery>
      </m:properties>
    </content>
  </entry>
</feed>

上記のコードでPHPを使用してこの問題を解決するのを手伝ってくれる人はいますか?

4

2 に答える 2

1

あなたは非常に接戦で、いくつかのマイナーな (しかし重要な) ポイントを逃しただけでした。

最小限の変更が必要

元のコードの 3 行を変更するだけで済みます。

  1. <entry>要素の取得。

    $feeds = $xml->entry->link->children('m', TRUE)->inline->entry;
    

    になる

    $feeds = $xml->entry->link->children('m', TRUE)->inline->children('', TRUE)->feed->entry;
    
  2. <d:*>から要素を取得し<m:properties>ます。

    $result = $data->children('m', TRUE)->properties->children('d', TRUE);
    

    になる

    $result = $results->content->children('m', TRUE)->properties->children('d', TRUE);
    
  3. 次の行を削除します。

    echo $data=(string)$results->content;
    

これらの変更により、スクリプトは必要な結果の配列を提供します。

コードのクリーンアップ

$search以下の例は、オリジナルを少し修正したもので、フィードから配列を少し整頓された*方法で構築しています。

* 私の目には、読者は同意しないかもしれません。厳しい、それは私の答えです。

$xml = new SimpleXMLElement($rs);

$i = 0;
$search = array();

$entries = $xml->entry->link->children('m', TRUE)->inline->children('', TRUE)->feed->entry;
foreach ($entries as $entry) {
    $i++;

    $properties = $entry->content->children('m', TRUE)->properties->children('d', TRUE);

    $url = (string) $properties->Url;
    $url = str_replace("&", "&amp;", urldecode($url));

    $search[$i] = array(
        'url'      => $url,
        'abstract' => (string) $properties->Description,
        'title'    => (string) $properties->Title,
        'rank'     => $i,
    );
}

何が変わったのですか?

  1. これは重要なポイントです。「最小限の変更」で説明したように、この$entries行は を使用して内の要素children('', TRUE)->feedにアクセスします。<feed><m:inline>
  2. 変数名は、必要に応じて、変数によって表される XML 要素の名前を反映するようにわずかに変更されました。これは、SimpleXML を使用する場合に非常に役立ちます。
  3. $search[$i]一度にすべてを割り当てます。これは、見た目がすっきりしていると思うので、個人的な好みです。
  4. echoそれらの奇妙な混合および割り当て行を取り除きました。
于 2012-08-15T19:19:15.370 に答える
0

これがあなたの質問に対する答えかどうかはわかりませんが、これらのビットは疑わしいようです:

echo $data=(string)$results->content;

$data$results->contentに割り当てる前にの値を string にキャストしたため、 には文字列が含まれるようになりました$data。ただし、コードの次の行は次のとおりです。

$result = $data->children('m', TRUE)->properties->children('d', TRUE);

ここで、$dataは文字列ではなくオブジェクトであることは明らかです。

そこにエコーが必要な場合は、行を分割します。

$data = $results->content;
echo $data; // casting to string is done automatically
于 2012-08-15T10:38:24.267 に答える