我有一个来自ModeShape(4.1)存储库的系统视图XML转储,我尝试导入到Jackrabbit(2.8)。
我的XML的根节点包含一个名为" jcr:root"的节点。 (但我已经评论了" jcr:uuid"和" jcr:primaryType"("模式:root"),因为Jackrabbit似乎并不喜欢这些)。
我使用以下方法导入XML:
session.importXML("/", stream, ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW);
XML看起来像(我已经把它弄得一团糟,因为我在一个封闭的网络上,所以无视名称空间,他们没关系: - ):
<?xml version="1.0" encoding="UTF-8" ?>
<sv:node xmlns:jcr=".../jcr/1.0" xmlns:sv=".../sv/1.0" ... sv:name="jcr:root">
<!-- jcr:uuid and jcr:primaryType properties commented out... -->
<sv:node sv:name="Messages">
...
</sv:node>
</sv:node>
将此导入Jackrabbit可以正常工作,但是,导入会创建一个名为&#34; jcr:root&#34;的新节点。 (包含&#34; Messages&#34;)在真实存储库根节点下,而不是放置&#34;消息&#34;直接位于存储库根节点下的节点(如ModeShape所做的那样)。
即,我得到:
/jcr:root/Messages
而不是我的预期:
/Messages
(我也尝试使用&#34; jcr:uuid&#34;匹配Jackrabbit存储库和IMPORT_UUID_COLLISION_REPLACE_EXISTING
的设置,但是有一个例外,根节点无法替换。)
如何在根节点下直接将其导入Jackrabbit?
更新:
在阅读JCR spec, section 11.9, "Importing jcr:root"时,似乎Jackrabbit和ModeShape都做对了。虽然我有点像ModeShape的行为。
Jackrabbit似乎表现得像IMPORT_UUID_CREATE_NEW
所说的那样(并且没有特别对待jcr:root
。如果我使用当前存储库根节点的值添加jcr:uuid
属性,则它按指定的方式工作。
ModeShape只是合并根,并且似乎根本不关心碰撞(这实际上是合理的,但不是根据规范中定义的任何行为)。
......或者我错了? : - )
答案 0 :(得分:1)
我应该尝试的一个明显的解决方案是将“Messages”节点移动到XML文档的根目录。
<?xml version="1.0" encoding="UTF-8" ?>
<sv:node sv:name="Messages" xmlns...>
...
</sv:node>
(不幸的是,我在根目录下有多个节点,因此我需要创建多个XML导出。不优雅,但可能是可行的。)