2011-07-27 12 views
5

के बाद इंडेक्स खोजें मैंने जावा में वीटीडी (मुझे लगता है कि वीटीडी-एक्सएमएल) का उपयोग करना शुरू कर दिया है, और XPath के लिए यह उत्कृष्ट है। जहां मैं अब एक मुद्दा मार रहा हूं डेटा डालने के साथ है। कहते हैं कि चलो मैं निम्नलिखित कर रहा हूँ:जावा में वीटीडी-एक्सएमएल - XMLModifier.insertAfterElement

VTDNav nav = preExistingGen.getNav(); 
AutoPilot pilot = new AutoPilot(nav); 
pilot.selectXPath("/Something/SomethingElse"); 
if (pilot.evalXPath() != -1) { 
    XMLModifier modifier = new XMLModifier(nav); 
    modifier.insertAfterElement("<some>content</some>"); 
} 

मैं क्या मान लिया था कि यह एक वास्तविक समय अद्यतन, जो VTDNav में भी परिलक्षित हुई थी। ऐसा लगता है कि मेरी समझ गलत है, क्योंकि केवल तत्व सामग्री डालने से नौसेना के लिए कुछ भी नहीं होता है (यदि मैं वीटीडीएनएवी आउटपुट करता हूं, तो इसमें अभी भी मेरा मूल एक्सएमएल है)। नए एक्सएमएल पर एक संभाल पाने का एकमात्र तरीका यह है कि इसे XMLModifier से आउटपुट करना है।

modifier.outputAndReparse(); // Gives me a new VTDNav with the new content 

क्या मुझे कुछ याद आ रहा है? क्या ऐसा करने का कोई आसान तरीका है? मैं नई सामग्री डालने में सक्षम होना चाहता था, और फिर तुरंत नई अनुक्रमणिका प्राप्त करें। मेरा मौजूदा कोड (मानक डीओएम कक्षाओं का उपयोग करके) में आवेषण और अद्यतन का एक टन है, और मुझे यह भी जानने की आवश्यकता है कि दस्तावेज़ में अंतिम सम्मिलित तत्व कहां मौजूद था। Output andReparse() को हर बार करने के लिए और फिर सम्मिलित तत्व (जिसे मैं गारंटी भी नहीं दे सकता) ढूंढ सकता हूं, एक व्यावहारिक समाधान की तरह प्रतीत नहीं होता है।

+1

ऐसा लगता है कि एक महान समाधान मैं कहीं भी मिल सकता है नहीं है की तरह। चूंकि मेरा कोड एक नया दस्तावेज़ बनाने के साथ काम करता है, इसलिए मैं अपने इनपुट दस्तावेज़ पर पढ़ने के लिए vtd का उपयोग करके और मेरे आउटपुट दस्तावेज़ पर लिखने के लिए डीओएम का उपयोग करके एक संकर दृष्टिकोण ले रहा हूं। – jpcamara

+0

+1, और मैंने दस्तावेज़ को पढ़ने और नेविगेट करने के लिए VTD का उपयोग करने का भी निर्णय लिया, लेकिन इसे संशोधित करने के लिए DOM का उपयोग करें। –

उत्तर

0
modifier.remove(): 

टेक्स्ट फ़ाइल में xpaths को संग्रहीत नहीं किया गया है, इसलिए प्रत्येक xpath के लिए एक नया आउटपुट xxx.xml फ़ाइल उत्पन्न करता है। जब यू वर्तमान डेटा के साथ एक्सएमएल संशोधक पिछले डेटा का उपयोग यह एक xxx.xml फ़ाइल में लिखेंगे तो पिछले डेटा के उन्मूलन के लिए और केवल वर्तमान xpath के लिए डेटा परिवर्तन नए xxx.xml फ़ाइल में लिखने के लिए इतना है कि modifier.remove का उपयोग करें ();

xm2.output(new FileOutputStream("/home/cupola-hadoop-project/TotalEnvironment/document/link/"+j+"101new.xml")); 
xm2.remove(); 

और पाश वांछित बार बारी बारी से।

+1

मुझे खेद है कि मैं इस जवाब को समझ नहीं पा रहा हूं। साथ ही, पढ़ने XMLModifier.remove() वर्णन झुकेंगे "मास्टर XML दस्तावेज़ से सामग्री निकालता है"। मुझे पूरा दस्तावेज़ चाहिए, साथ ही नई सामग्री नेविगेशन योग्य हो - शायद मैं उस बिंदु पर स्पष्ट नहीं था। वैसे, इनपुट के लिए धन्यवाद! – jpcamara

2

मुझे लगता है कि इस सवाल का जवाब नई सामग्री के लिए अपने संशोधन और बाद में पहुँच ध्यान से योजना बनाने के लिए है। यदि आप नई सामग्री डालते हैं, और तुरंत बाद में नई सामग्री तक पहुंचने का प्रयास करते हैं, तो डालें और पर्स() जाने का रास्ता है। लेकिन जैसा कि आप देख सकते हैं, यह मरम्मत के कारण धीमा है। मेरा सुझाव यह है कि आप एक बार में सभी को सम्मिलित करने की योजना बनाते हैं, फिर एक बार फिर से पोस्ट करना कॉल करें, यह इस तरह से बहुत अधिक कुशल होगा।

भावना है कि VTD-XML डोम बनने की कोशिश कर रहा है नहीं, यह अपने आप ही शक्तियों और कमजोरियों है ... और इस कमजोरी में से एक है, लेकिन आप इसे हल करने के कर सकते हैं ... और जब तुम कोशिश है एकाधिक एक्सएमएल फाइलों को मर्ज करने के लिए, vtd-xml निश्चित रूप से चमक जाएगा ....

यदि आप इस प्रश्न को vtd-xml के साथ टैग करते हैं, तो भी मैं इसे अधिक आसान पा सकूंगा।

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