2013-09-27 57 views
0

我正在致力於Adobe CQ。我正在提取原始文件的元數據,並獲取元數據作爲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屬性複製到新節點,然後遞歸地爲每個DOM節點子節點創建JCR節點。

我不知道這是否是所需的格式。您可以跳過第一級(具有格式名稱的節點)並將屬性直接寫入metadata節點。爲了做到這一點,從第一種方法中刪除formatNode,並用metadataNode替換它。隨意試驗並根據您的要求調整結果。