插入元件插入使用XQuery和XML的Java(Insert element into XML us

2019-10-17 00:21发布

我需要插入一个新的元素到使用XQuery表达式插入XML文档。 我使用saxon作为一个Java 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();
}

我的错误是在查询字符串的语法。 请帮忙。

Answer 1:

BaseX XQJ API支持XQuery更新设施1.0和3.0,它允许你在更新为baseX数据库中的文档。

您还可以更新通过MarkLogic XQJ API,塞德娜XQJ API中的数据库文件,并通过XQuery更新设施eXist的XQJ的API虽然没有,因为这些实现不支持XQUF(还)。

最后,可能也是最重要的是你的问题,你可能会发现瑞安格林“在-MEM-更新”库模块非常有用的[1]。 我当然有,在过去的无数次。

您可以

  • 使用库模块与任何的XQuery处理器+ XQJ
  • 执行更新到内存中的XML文档(不需要写入到磁盘)。
  • 对一个文档中的一个单次XQuery执行“多”更新操作
  • 后更新的存储器内文件可以在XQResultSequence(非常适合你)返回。

此外,只是为了明确的东西在这里,在XQJ 1.0规范不从支持XQuery更新设施不允许供应商。

从本说明书的摘录:

“18.6支持更新和交易

虽然更新的功能是不是[XQuery的]的一部分,XQJ预期一些实现将包括一些专有扩展来处理更新功能“。

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



Answer 2:

该XQJ API不支持XQuery的更新。 我相信,一些厂商已经扩展XQJ支持更新,但由于对XQJ许可条件强加给任何人死刑谁试图扩展API,我从撒克逊这样忍住了。 (我还没有意识到任何行动来定义这样的扩展 - XQJ被从它开始,因为我从来没有了解的原因一天扼杀律师)。

如果您在使用撒克逊为您的XQuery更新引擎,我建议使用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的更新仅在撒克逊的商用版本的支持。



Answer 3:

现在是可能的。

上传查询:

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);}

插入/ SELECT查询:

public static void ejecutarConsulta(String cadenaAConsultar) throws XQException {
    XQPreparedExpression consulta;
    consulta = xqc.prepareExpression(cadenaAConsultar);
    XQResultSequence resultado = consulta.executeQuery();
}


文章来源: Insert element into XML using XQuery and Java