0

私はAdobe CQに取り組んでいます。Raw ファイルのメタデータを抽出し、メタデータを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 ノードを作成します。2 つ目は、すべての DOM 属性を新しいノードにコピーしてから、DOM ノードの子ごとに JCR ノードを再帰的に作成します。

これが望ましい形式かどうかはわかりません。最初のレベル (フォーマット名を持つノード) をスキップして、ノードに属性を直接書き込むことができmetadataます。これを行うには、最初のメソッドを削除formatNodeして、 に置き換えmetadataNodeます。自由に実験して、必要に応じて結果を調整してください。

于 2013-09-27T16:47:57.510 に答える