2011-04-28 11 views
6

तो मेरा मामला यहाँ है।मैं एक स्ट्रिंग से XElement के तत्व को कैसे अपडेट/प्रतिस्थापित कर सकता हूं?

मेरे पास XElement है, चलिए इसे रूट कहते हैं, जिसमें वंशज हैं, जिनमें वंशज हैं, आदि। मैं LINQ से XML का उपयोग करके एक वंशज खींचता हूं, इसे .ToString() का उपयोग करके एक ज्ञापन संपादक में लोड करता हूं और इसे संपादित करता हूं। अब मैं मूल संस्करण के साथ मूल संस्करण को अद्यतन/प्रतिस्थापित करना चाहता हूं।

मुझे बताएं कि यह एक साधारण XML फ़ाइल है, बिना स्कीमा के, डीओएम का उपयोग नहीं, आदि। मुझे केवल तत्व को संपादित और अपडेट/प्रतिस्थापित करने में सक्षम होना चाहिए।

<Root> 
    <Genre Name="Rock"> 
    <Artist Name="Pink Floyd"> 
     <BandMembers> 
     <Member>Nick Mason</Member> 
     <Member>Syd Barret</Member> 
     <Member>David Gilmour</Member> 
     <Member>Roger Water</Member> 
     <Member>Richard Wright</Member> 
     </BandMembers> 
     <Category>Favorite band of all time</Category> 
    </Artist> 
    <Artist Name="Led Zepelin"> 
     <Category>Love the band</Category> 
    </Artist> 
    </Genre> 
    <Genre Name="Blues"> 
    <Artist Name="Muddy Waters"> 
     <Instrument>Harmonica</Instrument> 
    </Artist> 
    <Artist Name="Howling Wolf"> 
     <Instrument>Guitar</Instrument> 
    </Artist> 
    </Genre> 
</Root> 

अब कहते हैं कि मैं रोजर वाटर्स के अंतिम नाम सही करने के लिए "पिंक फ्लोयड" तत्व संपादित करना चाहते हैं:

यहाँ मेरी एक्सएमएल एक mockup है। मुझे वह तत्व मिलता है, इसे एक स्ट्रिंग में परिवर्तित करें, इसे मेरे संपादक में लोड करें, जो परिवर्तन मैं चाहता हूं उसे बनाएं, और इसे .Parse() का उपयोग करके XElement में परिवर्तित करें।

अब, मैं अपने मूल एक्सएमएल में "गुलाबी फ्लॉइड" नोड को कैसे अपडेट/प्रतिस्थापित कर सकता हूं?

// input would be your edited XML, this is just sample data to illustrate 
string input = @"<Artist Name=""Pink Floyd""> 
    <BandMembers> 
    <Member>Nick Mason</Member> 
    <Member>Syd Barret</Member> 
    <Member>David Gilmour</Member> 
    <Member>Roger Waters</Member> 
    <Member>Richard Wright</Member> 
    </BandMembers> 
    <Category>Favorite band of all time</Category> 
</Artist>"; 

var replacement = XElement.Parse(input); 
var pinkFloyd = xml.Elements("Genre") 
        .Where(e => e.Attribute("Name").Value == "Rock") 
        .Elements("Artist") 
        .Single(e => e.Attribute("Name").Value == "Pink Floyd"); 

pinkFloyd.ReplaceWith(replacement); 
Console.WriteLine(xml); 

आप हालांकि कुछ त्रुटि जाँच जोड़ना चाहिए:

+1

मैंने आपके एक्सएमएल को अपडेट किया क्योंकि उसके कुछ मेल खाने वाले नाम और गायब आइटम थे। यह एक वैध संरचना है लेकिन यह अभी भी पूरी तरह से संगत नहीं है, कलाकारों के साथ एक शैली के बाहर होने के साथ। –

+1

मैंने ब्लूज़ टैग के अंदर मड्डी और हाउलिंग को रखने के लिए एक्सएमएल अपडेट किया। अब वे घर हैं! ;) – pmartin

+0

ओह! एक्सएमएल को मुक्त करने के लिए मुझे यही मिलता है। =) –

उत्तर

11

आप XElement.ReplaceWith method इस्तेमाल कर सकते हैं। मैंने Single का उपयोग किया क्योंकि मुझे यकीन है कि नोड मौजूद है, लेकिन यदि कोई मौका है तो आपको SingleOrDefault का उपयोग नहीं करना चाहिए और परिणाम का उपयोग करने से पहले null देखें।

इसके अलावा, अगर इनपुट अमान्य है तो आपको उपरोक्त कोड को एक कोशिश/पकड़ में लपेटने और किसी भी XmlException को संभालने की आवश्यकता होगी जिसे फेंक दिया जा सकता है।

+0

वही है जो मैं ढूंढ रहा था। मुझे नहीं पता कि मैं "ReplaceWith" कैसे चूक गया, क्योंकि इसका नाम उस ऑपरेशन के रूप में ठीक से किया गया था जिसे मैं करना चाहता था। और संपादित ऐप सहेजने का प्रयास करते समय मेरा ऐप XmlException की जांच करता है। धन्यवाद। –

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

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