Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml Marklogic数据库中的节点更新_Xml_Marklogic - Fatal编程技术网

Xml Marklogic数据库中的节点更新

Xml Marklogic数据库中的节点更新,xml,marklogic,Xml,Marklogic,我在ML DB中保存了多个员工xml文档,文档uri为(/employee/*.xml),我想从新xml中获取更新,其中唯一引用键为roleID(在ML xml中为roleID,在新xml中为newroleID)。只要找到匹配项,它就应该用新xml的newFirstName更新ML xml的firstName值,用newlastName更新lastname值,用新dep更新dep,xml结构的其余部分应该保持不变 Marklogic XML结构如下所示: doc uri /employe

我在ML DB中保存了多个员工xml文档,文档uri为(/employee/*.xml),我想从新xml中获取更新,其中唯一引用键为roleID(在ML xml中为roleID,在新xml中为newroleID)。只要找到匹配项,它就应该用新xml的newFirstName更新ML xml的firstName值,用newlastName更新lastname值,用新dep更新dep,xml结构的其余部分应该保持不变

Marklogic XML结构如下所示:

    doc uri /employee/1.xml
    <employee>
        <firstName>Jim</firstName>
        <lastName>Day</lastName>
        <dep>IT</dep>
        <city>Boston</city>
        <roleID>1111<roleID>
        <internalID>2222</internalID>
    </employee>

    doc uri /employee/2.xml
    <employee>
        <firstName>Jan</firstName>
        <lastName>Silly</lastName>
        <dep>Finance</dep>
        <city>DC</city>
        <roleID>3333<roleID>
        <internalID>4444</internalID>
    </employee>

    doc uri /employee/3.xml
    <employee>
        <firstName>Jack</firstName>
        <lastName>John</lastName>
        <dep>HR</dep>
        <city>Virginia</city>
        <roleID>5555<roleID>
        <internalID>6666</internalID>
    </employee>
docuri/employee/1.xml
吉姆
白天
信息技术
波士顿
1111
2222
文档uri/employee/2.xml
简
愚蠢的
财务
直流
3333
4444
文档uri/employee/3.xml
杰克
约翰
人力资源
弗吉尼亚州
5555
6666
我正在尝试这个,但不知道如何更新文档,而且它似乎没有优化xquery,请帮助

    let $newXML := <employees>
                        <newemployee>
                            <NewfirstName>New Fname1</newfirstName>
                            <newlastName>New Lname1</newlastName>
                            <newdep>New Dep1</newdep>
                            <newcity>Boston</newcity>
                            <newroleID>1111<newroleID>
                            <internalID>2222</internalID>
                        </newemployee>
                        <newemployee>
                            <newfirstName>New Fname2</newfirstName>
                            <newlastName>New Lname</newlastName>
                            <newdep>New Dep</newdep>
                            <newcity>Boston</newcity>
                            <newroleID>5555<newroleID>
                            <newinternalID>6666</newinternalID>
                        </employee>
                    </employees>
    for $oldXML in doc("/employee/*.xml")/employee
        where $newXML/newemployee/newroleID eq $oldXML/roleID
        return
          for $Matched in $oldXML
            return
            let $finalXML := 
                (: Not sure how to update some nodes in given URI, where rest of structure remain same :)

                <employee>
                    <firstName>{$newXML/newemployee/newfirstName/text()}</firstName>
                    <lastName>{$newXML/newemployee/newlastName/text()}</lastName>
                    <dep>{$newXML/newemployee/newdep/text()}</dep>              
                </employee>
let$newXML:=
新Fname1
新Lname1
新部门1
波士顿
1111
2222
新Fname2
新名称
新副署长
波士顿
5555
6666
对于文档中的$oldXML(“/employee/*.xml”)/employee
其中$newXML/newemployee/newroleID eq$oldXML/roleID
返回
对于$oldXML中匹配的$
返回
让$finalXML:=
(:不确定如何更新给定URI中的某些节点,其中结构的其余部分保持不变:)
{$newXML/newemployee/newfirstName/text()}
{$newXML/newemployee/newlastName/text()}
{$newXML/newemployee/newdep/text()}
请参见

在文档示例中:

(: insert the doc :)
xdmp:document-insert("/example.xml", <a><b>bbb</b></a>);
(: replace the b node in the doc with this c node :)
xdmp:node-replace(doc("/example.xml")/a/b, <c>ccc</c>);
doc("/example.xml") => <a><c>ccc</c></a>
(:插入文档:)
xdmp:documentinsert(“/example.xml”,bbb);
(:将单据中的b节点替换为c节点:)
xdmp:节点替换(doc(“/example.xml”)/a/b,ccc);
doc(“/example.xml”)=>ccc
请参见

在文档示例中:

(: insert the doc :)
xdmp:document-insert("/example.xml", <a><b>bbb</b></a>);
(: replace the b node in the doc with this c node :)
xdmp:node-replace(doc("/example.xml")/a/b, <c>ccc</c>);
doc("/example.xml") => <a><c>ccc</c></a>
(:插入文档:)
xdmp:documentinsert(“/example.xml”,bbb);
(:将单据中的b节点替换为c节点:)
xdmp:节点替换(doc(“/example.xml”)/a/b,ccc);
doc(“/example.xml”)=>ccc
表达式
doc(“/employee/*.xml”)
不起作用。使用
xdmp:directory
,前提是创建目录(自动或手动)。或者,您可以使用
cts:urimatch
查找员工的uri,只要启用了uri词典,就可以将这些信息传递给
doc()

但是。。方法中最大的瓶颈是遍历所有文档。这是没有必要的。如果roleID是唯一的,那么将其用于uri,这样就不需要遍历所有文档,只需立即打开正确的文档即可。或者,使用可以由XQuery处理器优化的表达式,或者只依赖于索引。如下所示:

doc()[//roleID = $newRoleID]
或:

对于更新本身,您可以使用@sgarrett建议的
xdmp:node replace
和related,但也可以简单地重新创建整个XML,并使用xdmp:document insert完全替换它。无论如何,文档完全是在幕后被替换的,因此您几乎不会注意到与这些小文档的任何区别

表达式
doc(“/employee/*.xml”)
不起作用。使用
xdmp:directory
,前提是创建目录(自动或手动)。或者,您可以使用
cts:urimatch
查找员工的uri,只要启用了uri词典,就可以将这些信息传递给
doc()

但是。。方法中最大的瓶颈是遍历所有文档。这是没有必要的。如果roleID是唯一的,那么将其用于uri,这样就不需要遍历所有文档,只需立即打开正确的文档即可。或者,使用可以由XQuery处理器优化的表达式,或者只依赖于索引。如下所示:

doc()[//roleID = $newRoleID]
或:

对于更新本身,您可以使用@sgarrett建议的
xdmp:node replace
和related,但也可以简单地重新创建整个XML,并使用xdmp:document insert完全替换它。无论如何,文档完全是在幕后被替换的,因此您几乎不会注意到与这些小文档的任何区别


我可以想象cts:search比使用谓词执行
doc()
更快,但我可能错了。@sgarrett很大程度上取决于优化器是否认为它可以优化。可能需要修改一下确切的语法。像
xdmp:plan
这样的函数有助于实现这一点,但时间也应该足够了。如果经过优化,XPath路由的执行速度与cts:search路由相同。它们的意思完全相同。
xdmp:directory(“/employee/”,$depth)
不需要手动或自动创建目录。它使用通用索引。请看,我可以想象cts:search比使用谓词执行
doc()
更快,但我可能错了。@sgarrett很大程度上取决于优化器是否认为它可以优化。可能需要修改一下确切的语法。像
xdmp:plan
这样的函数有助于实现这一点,但时间也应该足够了。如果经过优化,XPath路由的执行速度与cts:search路由相同。它们的意思完全相同。
xdmp:directory(“/employee/”,$depth)
不需要手动或自动创建目录。它使用通用索引。看见