2009-05-19 15 views
17

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

<alert-set> 
    <warning>National Weather Service...</warning> 
    <start-date>5/19/2009</start-date> 
    <end-date>5/19/2009</end-date> 
</alert-set> 

और

<weather-set> 
    <chance-of-rain type="percent">31</chance-of-rain> 
    <conditions>Partly Cloudy</conditions> 
    <temperature type="Fahrenheit">78</temperature> 
</weather-set> 

है मैं क्या करना चाहते हैं क्या है एक रूट नोड के अंदर दो गठबंधन: < डेटासेट> संयुक्त डॉक्स </डेटासेट>

मैंने अस्थायी दस्तावेज़ बनाने और दस्तावेज़ों के रूट नोड्स के साथ बच्चों को बदलने की कोशिश की:

<DataSet> 
    <blank/> 
    <blank/> 
</DataSet> 

और मैं दो दस्तावेजों के मूल तत्वों के साथ दो रिक्त स्थानों को प्रतिस्थापित करने की उम्मीद कर रहा था लेकिन मुझे "WRONG_DOCUMENT_ERR: एक नोड का उपयोग किसी अन्य दस्तावेज़ में किया गया है जो इसे बनाया गया है।" मैंने रूट नोड्स को अपनाने और आयात करने की कोशिश की लेकिन मुझे एक ही त्रुटि मिल गई।

क्या प्रत्येक नोड के लिए नए तत्वों को पढ़ने और बनाने के बिना दस्तावेज़ों को संयोजित करने का कोई आसान तरीका नहीं है?

संपादित करें: नमूना कोड स्निपेट बस एक के लिए "रिक्त" दस्तावेज़ में स्थानांतरित करने का प्रयास कर रहा है ... importNode और adoptNode फ़ंक्शन दस्तावेज़ नोड्स को आयात/अपनाने नहीं कर सकते हैं, लेकिन वे तत्व नोड और इसके उप-आयात को आयात नहीं कर सकते ... या यदि ऐसा होता है, तो यह अभी भी संलग्न/प्रतिस्थापित करने के लिए काम नहीं कर रहा है।

Document xmlDoc;  //created elsewhere 
    Document weather = getWeather(latitude, longitude); 
    Element weatherRoot = weather.getDocumentElement(); 

    Node root = xmlDoc.getDocumentElement(); 
    Node adopt = weather.adoptNode(weatherRoot); 
    Node imported = weather.importNode(weatherRoot, true); 
    Node child = root.getFirstChild(); 

    root.replaceChild(adopt, child);  //initially tried replacing the <blank/> elements 
    root.replaceChild(imported, child); 

    root.appendChild(adopt); 
    root.appendChild(imported); 
    root.appendChild(adopt.cloneNode(true)); 

ये सब फेंक DOMException: WRONG_DOCUMENT_ERR: एक नोड एक है कि उसे बनाया से एक अलग दस्तावेज़ में प्रयोग किया जाता है।

मुझे लगता है कि मुझे यह पता लगाना होगा कि कैसे स्टैक्स का उपयोग करना है या दस्तावेजों को फिर से पढ़ना और नए तत्व बनाना ... ऐसा लगता है कि दस्तावेज़ों को गठबंधन करने के लिए बहुत अधिक काम लगता है।

+0

क्या आप उदाहरण कोड पोस्ट कर सकते हैं यह दिखाते हुए कि आप उन्हें गठबंधन करने का प्रयास कैसे कर रहे हैं? – Jonik

उत्तर

28

इससे थोड़ा मुश्किल है, लेकिन निम्न उदाहरण चलाता है:

public static void main(String[] args) { 

    DocumentImpl doc1 = new DocumentImpl(); 
    Element root1 = doc1.createElement("root1"); 
    Element node1 = doc1.createElement("node1"); 
    doc1.appendChild(root1); 
    root1.appendChild(node1); 

    DocumentImpl doc2 = new DocumentImpl(); 
    Element root2 = doc2.createElement("root2"); 
    Element node2 = doc2.createElement("node2"); 
    doc2.appendChild(root2); 
    root2.appendChild(node2); 

    DocumentImpl doc3 = new DocumentImpl(); 
    Element root3 = doc3.createElement("root3"); 
    doc3.appendChild(root3); 

    // root3.appendChild(root1); // Doesn't work -> DOMException 
    root3.appendChild(doc3.importNode(root1, true)); 

    // root3.appendChild(root2); // Doesn't work -> DOMException 
    root3.appendChild(doc3.importNode(root2, true)); 
} 
+3

धन्यवाद, यह काम करता है। मैं उस रूट के बजाय रूट नोड को अपना दस्तावेज़ आयात कर रहा था जिसे मैं सब कुछ गठबंधन करने की कोशिश कर रहा था। कभी-कभी लंच ब्रेक लेना सबकुछ हल करता है। धन्यवाद। – ravun

7

मुझे पता है तुम मिल गया मुद्दा पहले ही हल है, लेकिन मैं अभी भी XOM पुस्तकालय है कि मुझे का उपयोग कर इस समस्या पर एक चाकू ले जाना चाहा वर्तमान में परीक्षण (this question से संबंधित), और ऐसा करने के दौरान, एंड्रियास_D के उत्तर की तुलना में एक अलग दृष्टिकोण प्रदान करें।

(इस उदाहरण को आसान बनाने के लिए, मैं अपने <alert-set> और <weather-set> अलग फ़ाइलों, जो मैं nu.xom.Document उदाहरणों में पढ़ा में डाल दिया।)

import nu.xom.*; 

[...] 

Builder builder = new Builder(); 
Document alertDoc = builder.build(new File("src/xomtest", "alertset.xml")); 
Document weatherDoc = builder.build(new File("src/xomtest", "weatherset.xml")); 
Document mainDoc = builder.build("<DataSet><blank/><blank/></DataSet>", ""); 

Element root = mainDoc.getRootElement(); 
root.replaceChild(
    root.getFirstChildElement("blank"), alertDoc.getRootElement().copy()); 
root.replaceChild(
    root.getFirstChildElement("blank"), weatherDoc.getRootElement().copy()); 

प्रमुख तत्वों में से एक प्रति mainDoc में सम्मिलित करने के बनाने के लिए है ; अन्यथा आप शिकायत करेंगे कि "बच्चे के पास पहले से ही माता-पिता है"।

Outputting mainDoc अब देता है:

<?xml version="1.0" encoding="UTF-8"?> 
<DataSet> 
    <alert-set> 
     <warning>National Weather Service...</warning> 
     <start-date>5/19/2009</start-date> 
     <end-date>5/19/2009</end-date> 
    </alert-set> 
    <weather-set> 
     <chance-of-rain type="percent">31</chance-of-rain> 
     <conditions>Partly Cloudy</conditions> 
     <temperature type="Fahrenheit">78</temperature> 
    </weather-set> 
</DataSet> 

मेरे लिए खुशी की बात करने के लिए, यह बहुत ही XOM से कोई लेना देना सीधी-सपाट साबित हुआ। इसे लिखने में केवल कुछ मिनट लग गए, भले ही मैं निश्चित रूप से लाइब्रेरी के साथ बहुत अनुभवी हूं। (यह <blank/> तत्वों के बिना भी आसान हो गया था, यानी, बस <DataSet></DataSet> से शुरू हुआ।)

इसलिए, जब तक कि आपके पास केवल मानक जेडीके उपकरण का उपयोग करने के लिए अनिवार्य कारण नहीं हैं, मैं गर्मजोशी से एक्सओएम को आजमाने की सलाह देता हूं क्योंकि यह जावा में एक्सएमएल हैंडलिंग को और अधिक सुखद बना सकता है।

+0

बहुत बहुत धन्यवाद। मैंने तत्वों के बिना इसे निष्पादित कर दिया क्योंकि वे व्यर्थ थे ... मैं बस अपने सिर को डोम के चारों ओर लपेटने की कोशिश कर रहा था। एक्सओएम के साथ बिल्डिंग दस्तावेज़ निश्चित रूप से जो कुछ भी कर रहे थे उससे कहीं अधिक आसान दिखता है। मैं एक इंटर्न हूं इसलिए मैं अपने पैरों को गीला कर रहा हूं, लेकिन वापस देखकर मैं पहले से ही कुछ हफ्ते पहले लिखे गए कोड को बता सकता हूं, वह बहुत बदसूरत है। मैंने तब से सीखा है कि एक्सएसएलटी और javax.xml का उपयोग कैसे करें। ट्रांसफॉर्म और इससे चीजों को बहुत आसान बना दिया गया है। आपके उत्तर और एक्सओएम से लिंक के लिए धन्यवाद। मुझे यकीन है कि मैं जल्द ही इसका इस्तेमाल करूँगा। – ravun

+0

मदद की खुशी है :) तत्वों के बिना, आप बस रूट करेंगे .appendChild (alertDoc.getRootElement()। Copy()) और इसी तरह। वैसे, यह देखने के लिए कि क्या एक्सओएम एक्सएसएलटी के साथ आपकी मदद कर सकता है, http://www.xom.nu/apidocs/nu/xom/xslt/XSLTransform.html पर एक नज़र डालें। – Jonik

संबंधित मुद्दे