2011-10-11 14 views
12

एक्सएमएल दस्तावेजों को विलय करने के संबंध में मैंने जो समाधान किए हैं, वे मेरी इच्छा पूरी नहीं करते हैं। मुझे स्पष्ट करने दें:एक्सएमएल दस्तावेजों का विलय

एक्सएमएल दस्तावेज़ 1:

<?xml version="1.0" encoding="utf-8" ?> 
<a> 
    <b title="Original Section"> 
     <b title="Original Child Section"></b> 
     <b title="Original Child Section 2"></b> 
    </b> 
</a> 

एक्सएमएल दस्तावेज़ 2:

<?xml version="1.0" encoding="utf-8" ?> 
<a> 
    <b title="Original Section"> 
     <b title="Original Child Section"> 
      <b title="New Child For Old Section"></b> 
     </b> 
     <b title="Original Child Section 2"></b> 
    </b>  
    <b title="New Section"> 
     <b title="New Child Section"></b> 
    </b> 
</a> 

दस्तावेजों की सामग्री में समान हैं:

<?xml version="1.0" encoding="utf-8" ?> 
<a> 
    <b title="New Section"> 
     <b title="New Child Section"></b> 
    </b> 
    <b title="Original Section"> 
     <b title="Original Child Section"> 
      <b title="New Child For Old Section"></b> 
     </b> 
    </b>  
</a> 

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

चीयर्स और अग्रिम धन्यवाद!

* संपादित *

के बाद आम सहमति नहीं है छोरों और प्रत्यावर्तन बहुत जरूरी हैं कि, क्या सबसे खूबसूरत और कारगर तरीका यह पूरा करने के हो सकता है? मुझे लगता है कि इस समस्या के लिए एक और मौलिक सवाल यह है कि नोड्स की तुलना करने के लिए सबसे अच्छा तरीका क्या है?

+2

मैंने ग्राहक के लिए ऐसा कुछ लागू किया। यह मूल रूप से वैसे ही काम करता है जिस तरह से आप इसे लागू करेंगे: लूप और रिकर्सन का उपयोग करना। –

+2

अच्छा उदाहरण के लिए +1 –

+0

मैं @DanielHilgarth से सहमत हूं। लूपिंग और रिकर्सिंग मूल रूप से इसे पूरा करने का सबसे आसान तरीका है। – Kian

उत्तर

1

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

+0

यही मैंने सोचा था। तो मुझे लगता है कि इस समस्या के सबसे सुरुचिपूर्ण और कुशल समाधान के लिए मुझे अपने प्रश्न को संशोधित करना चाहिए। – nokturnal

1

मैं IEqualityComparer लिखूंगा जो निर्दिष्ट करता है कि दो नोड्स 'मैच' होते हैं - यानी शीर्षक मिलान नियम सेट करता है।

class XElementComparer : IEqualityComparer<XElement> 
{ 
    public bool Equals(XElement x, XElement y) 
    { 
     var xTitle = x.Attribute("title"); 
     var yTitle = y.Attribute("title"); 

     if (xTitle == null || yTitle == null) return false; 

     return xTitle.Value == yTitle.Value; 
    } 

    public int GetHashCode(XElement obj) 
    { 
     return base.GetHashCode(); 
    } 
} 

और फिर अपने एक्सएमएल के माध्यम से ट्राउल, नोड्स comparer के अनुसार से मेल विलय एक पुनरावर्ती विधि लिखें।

private XElement Merge(XElement node1, XElement node2) 
{ 
    // trivial cases 
    if (node1 == null) return node2; 
    if (node2 == null) return node1; 

    var elements1 = node1.Elements(); 
    var elements2 = node2.Elements(); 

    // create a merged root 
    var result = new XElement(node1.Name, node1.Attribute("title")); 

    var comparer = new XElementComparer(); 
    var mergedNodes = elements1.Union(elements2, comparer).ToList(); 

    // for the union of the elements, insert their merge values 
    foreach (var title in mergedNodes) 
    { 
     var child1 = elements1.SingleOrDefault(e => comparer.Equals(e, title)); 
     var child2 = elements2.SingleOrDefault(e => comparer.Equals(e, title)); 

     result.Add(Merge(child1, child2)); 
    } 

    return result; 
} 
+0

मुझे पता है कि वेरिएबल नाम थोड़ा सा है और मुझे ठीक से 'गेटहाशकोड' लागू करना चाहिए था, लेकिन मूल बातें वहां हैं। –

+0

यह बहुत ही आशाजनक दिखता है। यह बिल्कुल ठीक है कि मैं इस मुद्दे पर कैसे आ रहा था लेकिन बहुत चालाक :) मुझे इसके साथ गड़बड़ करने दो और देखें कि मैं किसके साथ आ सकता हूं – nokturnal