1

XML ドキュメントから作成者を取得しようとしていますが、一部の作成者の名前にアポストロフィが含まれているため、結果でエラーがスローされます。

入力:

<dblp>
    <book mdate="2002-01-03" key="books/aw/CeriF97">
        <author>Stefano Ceri</author>
        <author>Piero Fraternali</author>
        <title>Designing Database Applications with Objects and Rules: The IDEA Methodology</title>
        <publisher href="db/publishers/aw.html">Addison-Wesley</publisher>
        <year>1997</year>
        <isbn>0-201-40369-2</isbn>
    </book>
</dblp>

Java/XQuery コード:

public ArrayList<String> getArrayListOfAuthors(){

    String query = "for $x in fn:distinct-values(doc(\"" +xml_file_name+ "\")//author) " +
                    "order by $x "+
                    "return $x";

    System.out.println("XQuery query:"+query);
    ArrayList<String> myList = new ArrayList<String>();
    try{
        XQDataSource ds = new SaxonXQDataSource();
        XQConnection conn = ds.getConnection();
        XQExpression exp = conn.createExpression();

        XQSequence seq = exp.executeQuery(query);
        int i = 1;

        while (seq.next()) {
            i++;
            //System.out.println(seq.getAtomicValue());
                            myList.add(seq.getAtomicValue());
        }
        //System.out.println("\n== Total number of authors is "+i+" ==");

        seq.close();

    } catch (XQException err) {
    System.out.println("Failed as expected: " + err.getMessage());
    }
              return myList;
}

エラーメッセージ:

XPST0003 XQuery syntax error near #...e $y/author = 'Kieran O'Neill'#:
    Unmatched quote in expression
Error on line 1 column 109 
4

1 に答える 1

3

このエラー メッセージは、文字列の連結によってクエリを作成していることを強く示唆しています。おそらく、表示されたクエリから取得した著者のリストを処理することによってです。(サンプルにない $y を含むクエリを探します)。

次に、次のように連結を使用してクエリを作成する代わりに、次のように変更します。

query = "//author[@name="' + 名前 + "']"

パラメータを含むようにクエリを作成します。

query = "declare variable $name external; //author[@name=$name]"

$name の値を実行時パラメータとして指定してこれを実行します。アポストロフィを含む名前の問題を回避する以外にも、いくつかの利点があります。インジェクション攻撃のセキュリティ問題を回避し、クエリを一度コンパイルして繰り返し使用できるため、パフォーマンス上の利点を得ます。

于 2013-04-06T13:18:36.683 に答える