2

XMLドキュメントがあります:

     <items>
     <item>
     <id>1</id>
     <title>Title ABC Defg</title>
     <author>Author Name</author>
     <description>Description text </description>
     </item>
     ...
     </items>

そして、私は検索を行い、タイトル、著者、説明がフレーズを含んでいるかどうかを確認したいと思います

一度にそれを行う方法がわからず、関連性によって注文します。しかし、「単語」や「単語」を検索するほど重要ではありません。私はphpコードを使用しました:

    <?php
    $xml=simplexml_load_file(file.xml); 
    $query=$_GET['query'];
    $nodes= $xml->xpath("//item[contains(title,'$query')]");

    $count = count($nodes);
    for ($i=1;$i<=$count;$i++){

    $nodes= $xml->xpath("//item[contains(title,'$query')][$i]"); 
    foreach($nodes as $node) {
    $title = $node->title;
    $desc= $node->description;
    $auth= $node->auth;
    $id= $node->id;
    echo "id: $id<br />title: $title<br />author: $auth<br />desc: $desc<p>&nbsp;</p>
    ?>

タイトルだけを検索することは知っていますが、問題は、Wordを検索すると単語が見つからず、単語と単語の両方を取得したいということです。

著者のタイトルと説明を「接続」して検索し、なんとかして注文することもできれば、私は本当に感謝します。

編集:

私はなんとかすべてのタグを検索することができました(指定されているだけでなく、私にとっては大丈夫です)

だから私はこのようなコードを持っています:

    $query=strtolower(rawurldecode($_GET['s']));
    $nodes= $xml->xpath("//item[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'$query')]") // . - all i suppose

$queryの一種の検証も使用します

4

1 に答える 1

4

したがって、xpathを使用したテキスト検索を含む要素のすべての子を選択する方法を知りたいです<items><item>(大文字と小文字の区別は省略しています。リンクされた回答でわかります)。まず、すべてのアイテム要素:

//items/item

あなたはすでにそれを持っています。テキストを含むものだけを返すには、次の述語を追加します。

//items/item[contains(., 'XYZ')]

<title>子要素内のみを検索する場合:

//items/item[contains(title, 'XYZ')]

これは基本的にあなたがすでに持っているものですが、ライブを不必要に困難にします: 2 回行う必要はありません。マッチを直接繰り返すことができます:

$nodes = $xml->xpath("//items/item[contains(title, 'XYZ')]");
foreach ($nodes as $node)
{
    foreach ($node as $name => $prop) {
        printf("%s: %s\n", $name, $prop);
    }
    echo "\n";
}

出力:

id: 3
title: Title XYZ
author: Author Name
description: Description text 

xpath への入力をエスケープする方法 (読み取り専用であるため、SQL インジェクションほど危険ではありません) について学習するには、次の例を検討してください。

$query = 'XYZ';
$expression = sprintf("//item[contains(title,'%s')]", $query);
$nodes = $xml->xpath($expression);

次の式が作成されます。

//item[contains(title,'XYZ')]

しかし、そこに一重引用符があるとどうなりますか? 文字列が終了するため、エラーが発生します。

$query = 'd\'oh';

あげる:

Warning: SimpleXMLElement::xpath(): Invalid expression in ...

これを防ぐには、ここでアウトラインとして何かを行います。具体的には、値をドキュメントに割り当ててから比較します。

$query = 'd\'oh';
$xml['query'] = $query;
$nodes = $xml->xpath("//item[contains(title, /*/@query)]");

旧:一度に複数の質問をする:

  1. 大文字と小文字を区別しない xpath で検索する方法
  2. 関連性を調べる方法(関連性でソートするため)

関連性は未定義です。ある人に関連する可能性があるものは、他の人には無関係である可能性があるため、関連性を測定する方法に関する特定の定義がなければ、質問のその部分に答えることは困難です.

大文字と小文字を区別しない検索の場合、重複した質問は既にリンクされているため、それができるはずです。私の目には最高の最初の重複:

しかし、ここでも同様に、大文字と小文字のどちらが大文字であるかは未定義のままです。あなたは物事を指定していないので、あなたの質問は本当に答えることができません.

また、実際には入力を検証しません。

$query = $_GET['query'];
$nodes = $xml->xpath("//item[contains(title,'$query')]");

GET パラメータを使用して、ここに xpath を挿入することができます。そうしないと、まったく検索を実行できません。

于 2012-04-15T13:52:30.910 に答える