0

我正在研究 Adob​​e CQ。我正在提取原始文件的元数据,并将元数据作为IIOMetadata对象。

我将 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 文件和其他受支持的文件的默认映射。

4

1 回答 1

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. 随意尝试并根据您的要求调整结果。

于 2013-09-27T16:47:57.510 回答