1

XQuery 挿入式を使用して、XML ドキュメントに新しい要素を挿入する必要があります。私はsaxonJava APIとして使用しています。XQuery は初めてなので、挿入式の正確な構造がわかりません。誰でもこれで私を助けてくれませんか。

私の XML ファイルは次のようになります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<breakfast_menu>
<food>
 <name>Belgian Waffles</name>
 <price>$5.95</price>
 <description>two of our famous Belgian Waffles with plenty of real maple syrup<description>
 <calories>650</calories>
</food>
 </breakfast_menu>

挿入を実行するためのJavaコードは

public void insert() throws XQException{
    String queryString =
            //"declare variable $docName as xs:string external;"  + sep +
            "variable $stores := doc("+"food.xml"+")/*;"+
            "insert node element food {"+
            "element name { \"brnj\" },"+
            "element price { \"$20\" },"+
            "element description { \"whatever\" },"+
            "element calories { 300 },"+
            "} into $stores;";

 XQPreparedExpression expr = conn.prepareExpression(queryString);
 expr.bindObject(new QName("stores"), "food.xml", null);
 XQResultSequence rs = expr.executeQuery();
}

私が得るエラーは、クエリ文字列の構文にあります。助けてください。

4

3 に答える 3

2

XQJ API は XQuery の更新をサポートしていません。一部のベンダーは更新をサポートするために XQJ を拡張していると思いますが、XQJ のライセンス条件により、API を拡張しようとする者には死刑が課せられるため、Saxon ではこれを行うことを控えました。(また、そのような拡張機能を定義するためのイニシアチブについても認識していません。XQJ は、私が理解できない理由で、開始日から弁護士によって首を絞められていました。)

XQuery 更新エンジンとして Saxon を使用している場合は、s9api インターフェースを使用することをお勧めします。次に例を示します。

   public void run() throws SaxonApiException {
        Processor proc = new Processor(true);
        XQueryCompiler comp = proc.newXQueryCompiler();
        comp.setUpdatingEnabled(true);
        XQueryExecutable exp = comp.compile(
                "for $p in doc('data/books.xml')//PRICE " +
                "return replace value of node $p with $p + 0.05");

        XQueryEvaluator eval = exp.load();
        eval.run();
        for (Iterator<XdmNode> iter = eval.getUpdatedDocuments(); iter.hasNext();) {
            XdmNode root = iter.next();
            URI rootUri = root.getDocumentURI();
            if (rootUri != null && rootUri.getScheme().equals("file")) {
                try {
                    Serializer out = proc.newSerializer(new FileOutputStream(new File(rootUri)));
                    out.setOutputProperty(Serializer.Property.METHOD, "xml");
                    out.setOutputProperty(Serializer.Property.INDENT, "yes");
                    out.setOutputProperty(Serializer.Property.OMIT_XML_DECLARATION, "yes");
                    System.err.println("Rewriting " + rootUri);
                    proc.writeXdmValue(root, out);
                } catch (FileNotFoundException e) {
                    System.err.println("Could not write to file " + rootUri);
                }
            } else {
                System.err.println("Updated document not rewritten: location unknown or not updatable");
            }
        }
    }

複雑さのほとんどは、更新されたドキュメントをファイルストアに書き戻すことです。もちろん、これは必ずしもやりたいことではありません。

XQuery Update は、Saxon の商用版でのみサポートされていることに注意してください。

于 2012-07-12T07:51:02.767 に答える
1

BaseX XQJ APIは、BaseXデータベース内のドキュメントを更新できるXQuery UpdateFacility1.0および3.0をサポートしています。

また、MarkLogic XQJ API、Sedna XQJ API、およびeXist XQJ APIを介してデータベース内ドキュメントを更新することもできますが、これらの実装はXQUFを(まだ)サポートしていないため、XQuery更新機能を介してではありません。

最後に、そしておそらくあなたの質問にとって最も重要なこととして、RyanGrimmの「in-mem-update」ライブラリモジュールが非常に役立つことがわかるかもしれません[1]。私は確かに、過去に数え切れないほどの時間を持っています。

あなたはできる

  • ライブラリモジュールを任意のXQueryプロセッサ+XQJで使用する
  • インメモリXMLドキュメントの更新を実行します(ディスクに書き込む必要はありません)。
  • 1つの単一のXQueryでドキュメントに対して「複数の」更新操作を実行します
  • 更新後のメモリ内ドキュメントは、XQResultSequenceで返すことができます(あなたに最適です)。

また、ここで明確にするために、XQJ 1.0仕様では、ベンダーがXQueryUpdateFacilityをサポートすることを禁止していません。

仕様からの抜粋:

"18.6アップデートとトランザクションのサポート

更新機能は[XQuery]の一部ではありませんが、XQJは、一部の実装に更新機能を処理するための独自の拡張機能が含まれることを期待しています。」

[1] https://github.com/marklogic/commons/blob/master/memupdate/in-mem-update.xqy

于 2012-07-12T14:51:51.243 に答える
1

今は可能です。

アップロード クエリ:

public static void ejecutarConsultaU(String cadenaAConsultar) throws XQException {
    XQExpression consulta;
    consulta = xqc.createExpression();
    System.out.println("Inicio consulta \n");
    System.out.println(cadenaAConsultar);
    System.out.println("fin consulta \n");
    consulta.executeCommand(cadenaAConsultar);}

挿入/選択クエリ:

public static void ejecutarConsulta(String cadenaAConsultar) throws XQException {
    XQPreparedExpression consulta;
    consulta = xqc.prepareExpression(cadenaAConsultar);
    XQResultSequence resultado = consulta.executeQuery();
}
于 2015-05-06T00:41:47.607 に答える