2011-03-08 11 views
9

मेरा उद्देश्य xml फ़ाइल को डोम ऑब्जेक्ट में पढ़ना है, डोम ऑब्जेक्ट को संपादित करना, जिसमें कुछ नोड्स को निकालना शामिल है।क्लोनिंग dom.Document ऑब्जेक्ट

ऐसा करने के बाद मैं वास्तव में XML फ़ाइल को पार्स किए बिना डोम को अपने मूल स्थिति में पुनर्स्थापित करना चाहता हूं।

क्या वैसे भी मैं पहली बार xml फ़ाइल को पार्स करने के बाद प्राप्त डोम ऑब्जेक्ट को क्लोन कर सकता हूं। विचार हर समय xml पढ़ने और पार्सिंग से बचने के लिए है, बस मूल डोम पेड़ की एक प्रति रखें।

+0

की http://stackoverflow.com/questions/279154/how-can-i-clone-an-entire-document-using-the-java-dom –

उत्तर

5
TransformerFactory tfactory = TransformerFactory.newInstance(); 
Transformer tx = tfactory.newTransformer(); 
DOMSource source = new DOMSource(doc); 
DOMResult result = new DOMResult(); 
tx.transform(source,result); 
return (Document)result.getNode(); 

यह डोम दस्तावेज़ की एक प्रतिलिपि बनाने के लिए जावा 1.5 समाधान होगा। Transformer Factory और Transformer

+0

isEqualNode() वापस नहीं करता है संभावित शिकार यदि आप इस तरह से कॉपी करते हैं तो – ka3ak

+0

यह विधि कॉपी में निर्देशों और टिप्पणियों को संसाधित करती है! –

11

पर एक नजर डालें आप org.w3c.dom.Document पर importNode एपीआई का उपयोग कर सकते हैं:

Node copy = document.importNode(node, true); 

पूर्ण उदाहरण

import java.io.File; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 

     Document originalDocument = db.parse(new File("input.xml")); 
     Node originalRoot = originalDocument.getDocumentElement(); 

     Document copiedDocument = db.newDocument(); 
     Node copiedRoot = copiedDocument.importNode(originalRoot, true); 
     copiedDocument.appendChild(copiedRoot); 

    } 
} 
+0

सावधान रहें, दस्तावेज़ की प्रतिलिपि बनाने का यह तरीका फ़ाइल के भीतर प्रसंस्करण निर्देश या टिप्पणियों को हटा देगा! –

+0

मुझे विश्वास है कि यह किसी भी उपयोगकर्ता डेटा को हटा देगा जो पुराने दस्तावेज़ में किसी भी नोड्स में जोड़ा गया था! यह समझ में आता है कि यह ऐसा करता है, लेकिन किसी को जागरूक होना चाहिए – ParkerHalo

3

आप को क्लोन कर सकता है एक पेड़ या केवल डोम क्लोन नोड (बूलियन isDeepCopy) एपीआई के साथ नोड।

Document originalDoc = parseDoc(); 
Document clonedDoc = originalDoc.cloneNode(true); 

दुर्भाग्य से, के बाद से cloneNode() दस्तावेज़ पर कार्यान्वयन (एपीआई के अनुसार) है विशिष्ट है, हम एक बुलेट प्रूफ रास्ता के लिए जाना है, कि, एक नया दस्तावेज़ और आयात नोड के क्लोन मूल दस्तावेज से बनाने के है :

... 
Document clonedDoc = documentFactory.newDocument(); 
cloneDoc.appendChild(
    cloneDoc.importNode(originalDoc.getDocumentElement(), true) 
); 

ध्यान दें कि आपरेशन में से कोई भी धागा सुरक्षित हैं, तो या तो उन्हें केवल स्थानीय रूप से उपयोग करें, या थ्रेड-स्थानीय या उन्हें सिंक्रनाइज़।

0

मैं ट्रांसफॉर्मर फैक्ट्री के साथ दूसरे सुझाव के साथ रहूंगा। आयात नोड के साथ आपको दस्तावेज़ की पूरी प्रति प्राप्त नहीं होती है। हेडर कॉपी नहीं किया गया है।

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<?aid style="50" type="snippet" readerVersion="6.0" featureSet="257" product="8.0(370)" ?>  
<?aid SnippetType="PageItem"?><Document DOMVersion="8.0" Self="d"> 

यह उपरोक्त नहीं लौटाएगा क्योंकि इसकी प्रतिलिपि नहीं बनाई गई है। यह आपके नए दस्तावेज़ में कभी भी उपयोग करेगा।

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
संबंधित मुद्दे