2013-01-15 70 views
15

इस समय, मैं सॉफ्टवेयर कई एक्सएमएल विन्यास फाइल है कि का एक टुकड़ा प्रबंध कर रहा हूँ। जब सॉफ़्टवेयर का एक नया संस्करण जारी होता है, तो कभी-कभी बेस कॉन्फ़िगरेशन फ़ाइलें बदलती हैं, वर्तमान में स्टार्टअप पर हमारे पास सॉफ़्टवेयर कॉल KDiff है। यदि यह एक परिवर्तन का पता लगाता है, तो यह उपयोगकर्ता को परिवर्तन चुनने के लिए संकेत देता है।प्रोग्रामेटिक एक्सएमएल Diff/में मर्ज सी #

इस दृष्टिकोण के साथ समस्या

कि KDiff एक लाइन की तुलना कार्यक्रम और एक्सएमएल के तरीके के बारे में पता नहीं (है

आदर्श रूप में (नोड्स, आदि), मैं प्रोग्राम के रूप में सी # में एक पुस्तकालय के साथ काम करने के लिए चाहते हैं चूंकि हम एक एमएस दुकान हैं) जो दो एक्सएमएल फाइलों को डिफ कर सकते हैं: एक स्रोत एक्सएमएल और एक मौजूदा वर्किंग एक्सएमएल।

और फिर दोनों एक साथ मर्ज कुछ सरल नियमों का उपयोग कर:

  1. वर्तमान कार्य एक्सएमएल एक नोड कि स्रोत एक्सएमएल, ऐसा नहीं निकालता है है।
  2. स्रोत एक्सएमएल एक नोड कि वर्तमान कार्य एक्सएमएल, यह नहीं जोड़ करता है।
  3. तो दोनों एक ही नोड है और मूल्यों भिन्न होते हैं, स्रोत एक्सएमएल के मूल्य के पक्ष में, जब तक यह स्रोत एक्सएमएल के मान "UseExistingValue" पर सेट है।

उदाहरण के लिए, यहाँ "स्रोत" एक्सएमएल है:

<Configuration> 
    <Items> 
    <Item Id="1" Position="true"> 
     <Location X="UseExistingValue" Y="UseExistingValue" Z="UseExistingValue" /> 

     <Something/> 
     <SomethingElse/> 
    </Item> 
    </Items> 
</Configuration> 

और यहाँ "वर्तमान कार्य" एक्सएमएल है:

<Configuration> 
    <Items> 
    <Item Id="1" Position="false"> 
     <Location X="123" Y="234" Z="345" /> 
     <Another/> 
     <Something/> 

    </Item> 
    </Items> 
</Configuration> 

और मर्ज किए गए संस्करण की तरह दिखेगा:

<Configuration> 
    <Items> 
    <Item Id="1" Position="true"> 
     <Location X="123" Y="234" Z="345" /> 

     <Something/> 
     <SomethingElse/> 
    </Item> 
    </Items> 
</Configuration> 

मैं MS XML Diff and Patch Tool को देखा है और यह परिभाषा tely फ़ाइलों को एक साथ विलीन करता है, लेकिन प्रोग्रामेटिक नियमों की अनुमति नहीं देता है जिन्हें मैं परिभाषित करना चाहता हूं।

XMLUnit for Java devs होनहार लगता है, लेकिन इसके बारे में नेट संस्करण अविकसित लगता है, जो दुर्भाग्यपूर्ण है।

किसी के पास स्क्रिप्ट योग्य एक्सएमएल डिफ/मर्ज टूल्स और/या .NET पुस्तकालयों (भुगतान या मुक्त) के लिए कोई सुझाव है?

धन्यवाद।

उत्तर

19

घूमने के कुछ दिनों के बाद, मुझे एक समाधान मिला जो मुझे लगता है कि मेरे लिए काम करता है। शायद यह अन्य लोगों के लिए भी काम कर सकता है।

The MS XML Diff and Patch tool एक व्यवहार्य विकल्प था। जब आप दूसरी फ़ाइल के खिलाफ पहली फ़ाइल डिफ करते हैं तो यह एक एक्सएमएल "डिफग्राम" सूचीबद्ध करता है जो दो एक्सएमएल फाइलों के बीच क्या परिवर्तन करता है।

ऊपर सूचीबद्ध सभी 3 नियमों का ख्याल रखने के लिए, मैंने एक ही दिशा में दो फाइलों को डिफ किया, फिर लिंक-टू-एक्सएमएल का उपयोग करके डिफग्राम फ़ाइल खोला और सभी "जोड़ें" और "निकालें" लाइनों को हटा दिया ।

XNamespace xd = "http://schemas.microsoft.com/xmltools/2002/xmldiff"; 
var doc = XDocument.Load(_diffGramFile); 
doc.Root.DescendantsAndSelf(xd + "add").Remove(); 
doc.Root.DescendantsAndSelf(xd + "remove").Remove(); 

तो मैं (मर्ज किए गए) यह पहली फ़ाइल के खिलाफ संपादित diffgram समझौता और एक आंशिक रूप से अस्थायी फ़ाइल विलय कर बनाया। यह नियम 1 और 2 का ख्याल रखता है।

अगला, मैंने उपयोग की गई पहली फ़ाइल के विरुद्ध आंशिक रूप से विलय फ़ाइल को डिफ किया।फिर नया डिफग्राम खोला और सभी उपयोग संदर्भों को "UseExistingValue" में हटा दिया।

var newdoc = XDocument.Load(_diffGramFile); 
newdoc.Root.DescendantsAndSelf(xd + "change") 
     .Where(x => x.Value == "UseExistingValue").Remove(); 

और आंशिक रूप से विलय फ़ाइल के खिलाफ इस संपादित DiffGram जो तब बचत एक्सएमएल को यह बाहर नियम 3. का ख्याल रखता है अंतिम एक्सएमएल ऊपर परिभाषित नियमों के अनुसार विलय का उत्पादन विलय कर दिया।

उम्मीद है कि यह अन्य लोगों की मदद कर सकता है।

संकेत: XmlDiffPatch पुस्तकालय स्थापित करने के बाद, XmlDiffPatch DLL सी में पाया जा सकता है: \ Windows \ विधानसभा \ GAC \ XmlDiffPatch \ 1.0.8.28__b03f5f7f11d50a3a \ XmlDiffPatch.dll

+13

NuGet से XMLDiffPatch स्थापित करने के लिए http: //www.nuget.org/packages/XMLDiffPatch/ – Contango