2009-01-09 11 views
11

मुझे लगता है कि मेरे पास हल करने के लिए एक अनूठी समस्या है। खैर, मुझे Google का उपयोग करके पर्याप्त जानकारी नहीं मिल रही है। तो यहां यह जाता है,एक्सएमएल डिफ और मर्ज

मैं जावा ईई एसओए एप्लिकेशन पर काम करता हूं जो ओरेकल एक्सएमएल डीबी का उपयोग कर XML दस्तावेज़ों को एक्सएमएल के रूप में संग्रहीत करता है। जब भी एक्सएमएल बदलता है, मैं संस्करण बढ़ाता हूं और पिछले संस्करण को एक अलग तालिका में फेंक देता हूं।

अब आवश्यकता है, मुझे पूरे एक्सएमएल दस्तावेज़ की बजाय एक्सएमएल के रूप में 2 संस्करणों के बीच मतभेदों को स्टोर करना चाहिए।

  1. क्या कोई जावा लाइब्रेरी है जो एक्सएमएल तुलना कर सकती है? (XMLUnit, ...?)
  2. क्या XML अंतर को कैप्चर करने के लिए मानक XML स्कीमा है?
  3. संस्करणों के बीच आगे और आगे जाने के लिए एक्सएमएल में "मतभेद" लागू करने के लिए मैं किस परिवर्तन तकनीक का उपयोग कर सकता हूं? (एक्सएसएलटी, ग्रोवी, ....?)

मैं आपके समय की सराहना करता हूं।

+1

एक मानक प्रारूप के बारे में, आप [आरएफसी 5261] देखा है (https://tools.ietf.org/html/rfc5261)? - कभी नहीं की तुलना में बेहतर देर - यह एक छोटा सा द्वारा अपने प्रश्न पहले का है लगता है। – BrainSlugs83

उत्तर

4

जावा में लिखे गए खुले स्रोत एक्सएमएल डिफ टूल की संख्या है जिसे आप पालना कर सकते हैं। ऐसे उपकरणों की एक सूची here है।

9

मेरी आखिरी नौकरी में, हमें एक ही समस्या थी: हमें दो एक्सएमएल फाइलों के बीच विशिष्ट वस्तुओं के परिवर्तन, सम्मिलन और हटाने का पता लगाना पड़ा। फाइलें मनमाने ढंग से एक्सएमएल नहीं थीं; उन्हें हमारे एक्सएसडी का पालन करना पड़ा।

हमारा समाधान एक प्रकार का विलय सॉर्ट लागू करना था: फ़ाइलों को पार्स (एक एसएक्स पार्सर का उपयोग करके, एक डोम पार्सर नहीं, मनमाने ढंग से बड़ी फ़ाइलों को अनुमति देने के लिए), और अलग-अलग हैश मैप्स में पार्स किए गए डेटा को स्टोर करें। फिर, हमने मर्ज-सॉर्ट प्रकार के एल्गोरिदम का उपयोग करके दो मानचित्रों की सामग्री की तुलना की।

स्वाभाविक रूप से, बड़ी फ़ाइलों को मिल गया है, और अधिक स्मृति दबाव हम अनुभव है, इसलिए मैं अंततः एक FileHashMap वर्ग कि रैंडम एक्सेस फ़ाइलों के लिए HashMap के मूल्य अंतरिक्ष धक्का दिया लिखा था। सैद्धांतिक रूप से धीमी गति से, इस समाधान ने हमारी तुलना को बहुत बड़ी फ़ाइलों के साथ काम करने की इजाजत दी, बिना थ्रैशिंग या आउटऑफमेमरी एरर शर्तों के। (इस लाइब्रेरी में उस फ़ाइलशैश मैप क्लास का एक संस्करण उपलब्ध है: http://www.clapper.org/software/java/util/)

मुझे नहीं पता कि मैंने जो कुछ भी बताया है, वह भी आपको जो चाहिए उसे दूरस्थ रूप से बंद कर दिया गया है, लेकिन मैंने सोचा कि मैं इसे साझा करूँगा, बस मामले में।

शुभकामनाएं।

8

साइड नोट: वहाँ अब RFC 5261 में है एक्सएमएल-संवेदी "पैच" के लिए एक मानक प्रारूप,। कम से कम एक मुफ्त सॉफ्टवेयर प्रोग्राम है, xmlpatch, जो इसे लागू करता है। यह सी में लिखा गया है, आप इसे जावा से कॉल कर सकते हैं।

+0

हम्म, यह लिंक आपके द्वारा दी गई की तरह लग रहा libxmlpatch को जो एक सी ++ पुस्तकालय है। कहां है कमांड लाइन टूल (और खिड़कियों बाइनरी)? – BrainSlugs83

1

सुंदर डिफ का उपयोग करने का प्रयास करें। यह मूल एक्सएमएल सिंटैक्स पर कई अलग-अलग एक्सटेंशन के साथ काम करने के लिए डिज़ाइन किया गया है।

http://prettydiff.com/

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