एक सी # अनुप्रयोग में मुझे अपने एल्गोरिदम के आउटपुट की जांच करने की आवश्यकता है, जो कि एक और एक्सएमएल पेड़ के खिलाफ एक एक्सएमएल पेड़ है, यह देखने के लिए कि वे समान कैसे हैं। (नोड ऑर्डर महत्वपूर्ण है, लेकिन संरचना (नेस्टेड नोड्स), नोड्स के नाम अधिक महत्वपूर्ण हैं)। शायद 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 (= अधिकतम समानता) यदि जड़ नोड्स के नाम समान हैं और एक रूट नोड है कोई बच्चा नहीं और दूसरा एक मनमाना राशि है। क्या यह जानबूझकर है? – Haukinger
@ हौकिंजर मैंने इसे थोड़ा सा संशोधित किया है, लेकिन इसमें कई धोखाधड़ी हैं, वैसे भी यह सिर्फ एक शुरुआती बिंदु है। – Ahmad
क्या आप कृपया प्राथमिक और माध्यमिक के लिए एक्सएमएल स्निपेट के उदाहरण प्रदान कर सकते हैं जो आपकी राय में अभी भी समान हैं? समाधान पर काम करने के लिए वास्तव में मददगार होगा। –