【问题标题】:AEM6. XML import to JCR(Oak)AEM6。 XML 导入到 JCR(Oak)
【发布时间】:2015-06-06 10:51:29
【问题描述】:

在从 CQ5.4 迁移到 AEM6 期间,我在将 XML 数据导入 JCR 时遇到了问题。

在 CQ5.4 上,我们使用“内容加载器工具”(http(s)://[host]:[port]/crx/loader/index.jsp)将 xml 加载到 jcr。 从 CQ5.6.1 开始,该工具已被弃用并消失。 AEM6 也没有,就像几个 crx:Xml* 主节点类型(crx:XmlCharacterData, crx:XmlDocument, crx:XmlElement, crx:XmlNode)。

我尝试在示例 groovy 脚本下方以编程方式重新导入数据

importXML();
def importXML(){
    FileInputStream  inputStream = new FileInputStream("c:/data.xml "); // XML file
    session.importXML("/content/xmlNode", // Destination JCR node
        inputStream ,
        javax.jcr.ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW);
    session.save();
}

但是作为导入结果,我丢失了所有兄弟数据。 导入的数据在 JCR 中每一层只有一个节点。 原因是 Oak 不支持同名兄弟姐妹 (SNS)。

http://docs.adobe.com/docs/en/aem/6-0/deploy/upgrade/introduction-to-oak.html http://jackrabbit.apache.org/oak/docs/differences.html#Same_name_siblings

我不需要支持 SNS 或 crx:Xml* 节点类型。 我很高兴为兄弟姐妹(即 node_1、node_2)和主节点类型“nt:unstructured”生成唯一的名称。 或任何其他 jcr 结构,它保留所有从 XML 导入的数据。

如何将 XML 数据导入 AEM6?请帮帮我。

【问题讨论】:

    标签: xml aem jcr jackrabbit


    【解决方案1】:

    不幸的是,似乎不存在自动创建唯一节点的能力(例如,JcrUtils 具有 createUnique 方法,该方法会将数字附加到冲突的节点名称)。可以使用 XSLT 重命名每个节点,使其唯一。

    【讨论】:

      【解决方案2】:

      希望这会对某人有所帮助

      这是我使用 Importer 完成的方法:

      1)这是一个简单的导入器类

      @Service(value = Importer.class)
      @Component
      @Property(name = "importer.scheme", value = "importedData", propertyPrivate =true)
      
      public class DataImporter implements Importer {
      private final String SOURCE_URL = "http://someserver/data.xml";
      private static final Logger LOGGER = LoggerFactory.getLogger(DealerDataImporter.class);
      
      @Override
      public void importData(String s, String s2, Resource resource) throws ImportException {
      
          try {
      
              URL url = new URL(SOURCE_URL);
              URLConnection connection = url.openConnection();
              Document doc = parseXML(connection.getInputStream());
              NodeList Nodes = doc.getElementsByTagName("retailer");
              for (int i = 0; i < Nodes.getLength(); i++) {
                  Element element = (Element) Nodes.item(i);
                  String id = element.getElementsByTagName("id").item(0).getTextContent();
                  String name = element.getElementsByTagName("display_name").item(0).getTextContent();
                  String about = element.getElementsByTagName("about").item(0).getTextContent();
                  writeToRepository(id, name, about, resource);
              }
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
      
      private void writeToRepository(String id, String name, String about, Resource resource) {
      
          try {
              javax.jcr.Node parentNode = resource.adaptTo(javax.jcr.Node.class);
      
              //Say we want this to be a Page node (use NameConstants.NT_PAGE = cq:Page)
              //all of node types can be created this way
              javax.jcr.Node pageNode = JcrUtil.createPath(parentNode.getPath() + "/" + name, NameConstants.NT_PAGE, parentNode.getSession());
              //Page nodes need jcr:content node to hold all teh relevant properties (NameConstants.NN_CONTENT = "jcr:content")
              javax.jcr.Node contentNode = JcrUtil.createPath(pageNode.getPath() + "/" + NameConstants.NN_CONTENT, "cq:PageContent", parentNode.getSession());
              //set some properties
              contentNode.setProperty("about", about);
              contentNode.setProperty("id", id);
              //save session
              parentNode.getSession().save();
      
          } catch (Exception e1) {
              e1.printStackTrace();
          } 
      }
      private Document parseXML(InputStream stream){...}
      }
      

      2)然后在/etc/importers/polling下的CRXde中添加sling:Folder类型的新节点并添加一些属性:

      a) target [String] 这是存储库资源的路径,此资源将被解析为您的 Importer 类。

      b) source [String] 如果您希望从多个 xml 文件导入 重要的是,该值需要以 importData 开头(作为它们链接的类中的属性),然后是 :SOME_VALIABLE 这是上面示例中的 s2 变量。

      c) 间隔[Long] 多久运行一次 Importer

      d) 添加一个 mixin jcr:mixinTypes type cq:PollConfig

      应该就是这样,到目前为止,我能够使用这种技术导入任何数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多