将XML输入流映射到JCR

时间:2013-09-27 14:25:01

标签: java xml metadata cq5 jcr

我正在研究Adobe CQ。我正在为Raw文件提取元数据,并将元数据作为IIOMetadata对象获取。

我通过session.importXml将XML输入流映射到JCR 但是因为我的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文件和其他支持的文件一样。

1 个答案:

答案 0 :(得分: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属性复制到新节点,然后递归地为每个DOM节点子节点创建JCR节点。

我不知道这是否是一种理想的格式。您可以跳过第一级(具有格式名称的节点)并将属性直接写入metadata节点。为此,请从第一个方法中删除formatNode,并将其替换为metadataNode。您可以随意尝试并根据您的要求调整结果。