我正在研究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 < 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 :(得分: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
。您可以随意尝试并根据您的要求调整结果。