2015-04-01 1 views
0

Lors de la migration du site de CQ5.4 vers AEM6, j'ai rencontré des problèmes lors de l'importation de données XML dans JCR. Sur CQ5.4, nous avons utilisé "Content Loader Tool" (http (s): // [hôte]: [port] /crx/loader/index.jsp) pour charger xml dans jcr. A partir de CQ5.6.1 cet outil était obsolète et disparu. AEM6 ne l'a pas aussi, la même chose que plusieurs types de noeuds primaires crx: Xml * (crx: XmlCharacterData, crx: XmlDocument, crx: XmlElement, crx: XmlNode).AEM6. Importation XML vers JCR (Oak)

J'ai essayé de réimporter les données par programme, ci-dessous exemple de script 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(); 
} 

Mais comme résultat de l'importation, j'ai perdu toutes les données de frères et soeurs. Les données importées ont un seul nœud sur chaque couche dans JCR. La raison en est que Oak ne prend pas en charge les frères et sœurs de même nom (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

Je ne ai pas besoin de soutien ou SNS CRX: Xml * types de nœuds. Je suis heureux d'avoir des noms générés uniques pour les frères et sœurs (c'est-à-dire, node_1, node_2) et le type de noeud principal "nt: unstructured". Ou toute autre structure jcr, qui conserve toutes les données importées à partir de XML.

Comment importer des données XML vers AEM6? Aidez-moi, s'il vous plaît.

Répondre

0

Malheureusement, il semble que la possibilité de créer automatiquement des nœuds uniques n'existe pas (JcrUtils a par exemple la méthode createUnique qui ajoutera des numéros aux noms de nœuds en conflit). Il serait possible d'utiliser XSLT pour renommer chaque nœud afin qu'il soit unique.

0

Espérons que cela aide quelqu'un

voici comment je l'ai fait à l'aide Importateur:

1) ici est une simple classe importateur

@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) Puis, en CRXde sous /etc/importateurs/polling ajouter un nouveau noeud de type sling: Dossier et ajouter des propriétés:

a) target [String] c'est le chemin vers une ressource de référentiel. Cette ressource sera analysée par rapport à votre classe d'importateur. B) source [String] si vous cherchez à importer à partir de plusieurs fichiers xml IMPORTANT La valeur doit démarrer importedData (en tant que propriété de la classe à laquelle ils sont liés) suivie de: SOME_VALIABLE un s2 varaible dans l'exemple ci-dessus.

c) Intervalle [long] la fréquence d'exécution Importateur

d) ajouter un RJC mixin: mixinTypes Type cq: PollConfig

Cela devrait être et jusqu'à présent, je suis en mesure d'importer des données à l'aide cette techniques