2016-02-14 4 views
17

एक सी # अनुप्रयोग में मुझे अपने एल्गोरिदम के आउटपुट की जांच करने की आवश्यकता है, जो कि एक और एक्सएमएल पेड़ के खिलाफ एक एक्सएमएल पेड़ है, यह देखने के लिए कि वे समान कैसे हैं। (नोड ऑर्डर महत्वपूर्ण है, लेकिन संरचना (नेस्टेड नोड्स), नोड्स के नाम अधिक महत्वपूर्ण हैं)। शायद adds, removes और moves की संख्या जो कुछ "Tree Edit distance" एल्गोरिदम में होती है, एक अच्छा संकेतक हो। लेकिन उत्तर अधिक जावा या पायथन पैकेज हैं।दो एक्सएमएल पेड़ों की समानता की जांच कैसे करें (सी # में वृक्ष संपादित करें)

तो, मैंने XMLDiffPatch का उपयोग करने का प्रयास किया, यह अच्छा काम करता है जब एल्गोरिदम प्रकार Precise पर सेट होता है। हालांकि इसका बुरा मुद्दा यह है कि यह केवल DiffGram फ़ाइल उत्पन्न करता है जिसे संचालन की संख्या खोजने के लिए विश्लेषण करने की आवश्यकता होती है। इसके अलावा, यह बहुत छोटी है और कुछ एक्सएमएल पेड़ों के लिए OutOfRangeException उत्पन्न करता है। मुझे नेट के लिए मेरे उद्देश्य के लिए बेहतर पैकेज भी नहीं मिल सका। कुछ Xml difference packages हैं लेकिन शायद उनमें से कोई भी या Tree Edit Distance पर नहीं है।

एक उदाहरण:

<A> 
    <B> 
    <C></C> 
    <D></D> 
    <E> 
     <F> 
     </F> 
    </E> 
    </B> 
</A> 

करने के लिए:

<A>  
    <C></C> 
    <D></D> 
    <G></G> 
</A> 

दूसरे के लिए पहली Xml बदलने के लिए, आप E और F (2 लागत) को निकालना तो आप B दूर करने के लिए (की जरूरत है लेकिन इसके उप पेड़ नहीं) और G जोड़ने के लिए। तो कुल लागत 4.

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

public int XMLCompare(XmlNode primary, XmlNode secondary) 
{ 
    int x = 0; 
    if (secondary == null || primary == null) 
     return 1; 

    if (secondary.ChildNodes.Count == 1 && primary.ChildNodes.Count > 1) 
    { 
     x += XMLCompare(primary, secondary.ChildNodes[0]); 
    } 
    else if (secondary.ChildNodes.Count > 1 && primary.ChildNodes.Count == 1) 
    { 
     x += XMLCompare(primary.ChildNodes[0], secondary); 
    } 
    else 
    { 
     if (primary.Name.ToLower() != secondary.Name.ToLower()) 
      x = 1; 
     int m = Math.Max(primary.ChildNodes.Count, secondary.ChildNodes.Count); 
     for (int i = 0; i < m i++) 
     { 
      x += XMLCompare(
      i < primary.ChildNodes.Count ? primary.ChildNodes[i] : null, 
      i < secondary.ChildNodes.Count ? secondary.ChildNodes[i] : null); 

     } 
    } 

    return x; 
} 
+0

दो पेड़ अपने एल्गोरिथ्म द्वारा रेट किए जाते हैं 0 (= अधिकतम समानता) यदि जड़ नोड्स के नाम समान हैं और एक रूट नोड है कोई बच्चा नहीं और दूसरा एक मनमाना राशि है। क्या यह जानबूझकर है? – Haukinger

+0

@ हौकिंजर मैंने इसे थोड़ा सा संशोधित किया है, लेकिन इसमें कई धोखाधड़ी हैं, वैसे भी यह सिर्फ एक शुरुआती बिंदु है। – Ahmad

+1

क्या आप कृपया प्राथमिक और माध्यमिक के लिए एक्सएमएल स्निपेट के उदाहरण प्रदान कर सकते हैं जो आपकी राय में अभी भी समान हैं? समाधान पर काम करने के लिए वास्तव में मददगार होगा। –

उत्तर

3

माइक्रोसॉफ्ट कि के लिए एक API है। this देखें। यह पुराना डीएलएल संदर्भ हो सकता है लेकिन सिर्फ आपके लिए जानकारी के लिए, आपको इस तरह कुछ उपयोग करने की आवश्यकता है। C: \ Windows \ विधानसभा \ GAC \ XmlDiffPatch \ 1.0.8.28__b03f5f7f11d50a3a \ XmlDiffPatch.dll

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