Hi 
> >  private SVGDocument doc2svgDoc (Document doc) {
> >        SVGDocument svgDoc;
>
>          svgDoc =
> (SVGDocument)org.apache.batik.dom.util.DOMUtilities.deepCloneDocument(doc,
> org.apache.batik.dom.svg.SVGDOMImplementation.getDOMImplementation());
>
> >        return svgDoc;
> >   }
>
> I have not try to compile, but it should work ;-)
>
Hi, 

thanks for help. 

1. the "deepCloneDocument" doesn't work correct. It doesn't 
   create attributes for the child nodes. This could be a bug in the          
   "Node.cloneNode()" or "Document.importNode()" methods in the Batik         
    implementation of Node, Document. ???

2. There is no documentation for the DOMUtilities class in the batik Javadoc  
   API? 

3. I wrote the following method which work well for my purpose. 

---
    public static Node cloneNodeRec(Node source, Document targetDoc) 
    {
        String nodeName;
        int sourceType  = source.getNodeType();
        Node result = null;
        NamedNodeMap attr;
        NodeList children;

        switch (sourceType) {
        case Node.DOCUMENT_NODE:
            break;
        case Node.ELEMENT_NODE:
            nodeName = source.getNodeName();
            Element resultE =  targetDoc.createElement(nodeName);
            NamedNodeMap attrs = source.getAttributes();
            for(int i = 0; i < attrs.getLength();i++) {
                Node current = attrs.item(i);
                resultE.setAttributeNode((Attr)targetDoc.importNode(attrs.item(i), 
true));
            }
            children = source.getChildNodes();      
            if(children != null) {
                for (int i = 0; i < children.getLength(); i++) {
                    resultE.appendChild(cloneNodeRec(children.item(i), targetDoc));
                }
            }
            result = (Node) resultE;
            break;
        case Node.TEXT_NODE:
            Node txtNode = targetDoc.createTextNode(source.getNodeValue());
            result = txtNode;
            break;
        default:
            nodeName = source.getNodeName();
            Element resultD = targetDoc.createElement(nodeName);
            NamedNodeMap attrs2 = source.getAttributes();
            for(int i = 0; i < attrs2.getLength();i++) {
                Node current = attrs2.item(i);
                resultD.setAttributeNode((Attr)targetDoc.importNode(attrs2.item(i), 
true));
            }
            result = (Node) resultD;
            // no children!!
        }
        return result;
    }
---
    /**
     * Deep clones a document using the given DOM implementation.
     */
    public static Document deepCloneDocument(Document doc, 
                                             DOMImplementation impl) {
        
        Element root = doc.getDocumentElement();
        Document result = impl.createDocument(root.getNamespaceURI(),
                                                     root.getNodeName(),
                                                     null);
        Element rroot = result.getDocumentElement();    
        if (root.hasAttributes()) {
            NamedNodeMap attr = root.getAttributes();
            int len = attr.getLength();
            for (int i = 0; i < len; i++) {
                rroot.setAttributeNode((Attr)result.importNode(attr.item(i), true));
            }
        }
        NodeList children = root.getChildNodes();           
        if(children != null) {
            for (int i = 0; i < children.getLength(); i++) {
                rroot.appendChild(cloneNodeRec(children.item(i), result));
            }
        }
        return result;
    }
---


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to