2013-09-27 2 views
0

Я работаю над Adobe CQ. Я извлекаю метаданные для Raw-файлов и получаю метаданные как объект IIOMetadata.Сопоставление потока ввода XML с JCR

Я отображение входного XML поток в JCR, по session.importXml , но так как мой XML, как

<parentTag name ="" value =""><child tag.....</parentTage> 

(это означает, что нет ничего подобного parent : properties, нет использование знака двоеточия)

Таким образом, после сопоставление, я получаю все имя свойства как узел, и там значение как свойство узла, из-за этого есть ад нет. узлов.

Можете ли вы сказать мне, есть ли способ правильно отобразить карту?

примечание: Я извлечение метаданных из файлов CRW, и я получаю IIOMetadata как объект. Затем я конвертирую этот объект IIOMetadata в поток ввода XML. а затем отображение на session.import

ImageReader reader = ImageIO.getImageReaders(tempFile).next(); 
final IIOMetadata metadata = reader.getImageMetadata(0); 

String[] mdatanames = metadata.getMetadataFormatNames(); 

for(int i=0;i &lt mdatanames.length; i++) 
{ 

    Node metadatadom = metadata.getAsTree(mdatanames[i]); 

    DOMSource source = new DOMSource(metadatadom); 

    StringWriter writer = new StringWriter(); 
    StreamResult result1 = new StreamResult(writer); 

    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    StreamResult result = new StreamResult(os); 

    Transformer transformer =     

    TransformerFactory.newInstance().newTransformer(); 
    transformer.transform(source, result); 
    transformer.transform(source, result1); 

    ByteArrayInputStream bais = new 

    ByteArrayInputStream(os.toByteArray()); 
    String nodePath1 = asset.getPath() + "/jcr:content/metadata" ; 
    session.importXML(nodePath1, bais,  
    ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW); 

    String metadata_in_xml = writer.toString(); 
} 

Я использовал ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING тоже.

Пожалуйста, помогите .. Я хочу отображать метаданные, такие как сопоставление по умолчанию, как для файла DNG и других поддерживаемых файлов.

ответ

0

Я думаю, что вы должны вручную перебирать все свойства и дочерние узлы объекта IIOMetadata и создавать связанные JCR-узлы и свойства в рамках актива. Создание и преобразование представления XML является излишним (предполагая, что это возможно вообще).

У меня нет большого опыта работы с IIOMetadata файлов, но вы можете начать с чем-то вроде этого:

import com.day.cq.dam.api.Asset; 
import javax.imageio.metadata.IIOMetadata; 
import javax.jcr.Node; 
import javax.jcr.RepositoryException; 
import org.apache.jackrabbit.commons.JcrUtils; 
import org.apache.sling.api.resource.Resource; 
import org.w3c.dom.DOMException; 
import org.w3c.dom.NamedNodeMap; 
import org.w3c.dom.NodeList; 

... 

public void writeMetadataToNode(IIOMetadata metadata, Asset asset) throws RepositoryException { 
    Resource resource = asset.adaptTo(Resource.class); 
    Node metadataNode = resource.getChild("jcr:content/metadata").adaptTo(Node.class); 
    for (String formatName : metadata.getMetadataFormatNames()) { 
     Node formatNode = JcrUtils.getOrAddNode(metadataNode, formatName); 
     org.w3c.dom.Node domRoot = metadata.getAsTree(formatName); 
     copyDomToJcr(formatNode, domRoot); 
    } 
    metadataNode.getSession().save(); 
} 

private void copyDomToJcr(Node jcrNode, org.w3c.dom.Node domNode) throws DOMException, RepositoryException { 
    NamedNodeMap attributes = domNode.getAttributes(); 
    for (int i = 0; i < attributes.getLength(); i++) { 
     org.w3c.dom.Node attribute = attributes.item(i); 
     jcrNode.setProperty(attribute.getNodeName(), attribute.getNodeValue()); 
    } 
    NodeList children = domNode.getChildNodes(); 
    for (int i = 0; i < children.getLength(); i++) { 
     org.w3c.dom.Node child = children.item(i); 
     Node newJcrNode = JcrUtils.getOrAddNode(jcrNode, child.getNodeName()); 
     copyDomToJcr(newJcrNode, child); 
    } 
} 

Первый метод создает JCR узел для каждого формата метаданных. Вторая копирует все атрибуты DOM на новый узел, а затем рекурсивно создает узел JCR для каждого дочернего узла DOM.

Я не знаю, является ли это желаемым форматом. Вы можете пропустить первый уровень (узлы с именами форматов) и записать атрибуты непосредственно на узел metadata. Для этого удалите formatNode с первого метода и замените его на metadataNode. Не стесняйтесь экспериментировать и приспосабливать результаты к вашим требованиям.

Смежные вопросы