2011-12-14 15 views
5

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

XDocument configDoc = XDocument.Load(fileName, LoadOptions.PreserveWhitespace); 
// modifications to configDoc here 
configDoc.Save(fileName, SaveOptions.DisableFormatting); 

वहाँ कुछ समस्याओं कि यहाँ पॉप अप है:

  1. encoding="utf-8" XML घोषणा में जुड़ जाता है।
  2. <tag attr="val"/><tag attr="val" />
  3. गुण जो पठनीयता के लिए अलग-अलग रेखाओं में फैले हुए थे, सभी को एक पंक्ति में धक्का दिया जाता है।

क्या XDocument के साथ कम घुसपैठ करने का कोई तरीका है या क्या मुझे बस इतना करना है कि मैं जो चाहता हूं उसे स्ट्रिंग संपादन करना होगा?

उत्तर

4

LINQ से एक्सएमएल ऑब्जेक्ट मॉडल स्टोर नहीं करता है कि कोई तत्व पार्स किया गया है <foo/> या <foo /> के रूप में चिह्नित किया गया है ताकि ऐसी जानकारी को वापस सहेजने पर खो जाए। यदि आप एक निश्चित प्रारूप सुनिश्चित करना चाहते हैं तो आप एक एक्सएमएलवाइटर कार्यान्वयन बढ़ा सकते हैं और http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writeendelement.aspx को ओवरराइड कर सकते हैं लेकिन इस तरह आप इनपुट प्रारूप को भी सुरक्षित नहीं रखेंगे, बल्कि आप <foo/> या किसी भी प्रारूप को अपनी विधि में लागू करने वाले प्रारूप के रूप में लिखेंगे ।

वहाँ है अन्य परिवर्तन है कि, हो सकता है, उदाहरण के लिए जब फाइल

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Example</title> 
    </head> 
    <body> 
    <h1>Example</h1> 
    </body> 
</html> 

लोड हो रहा है और यह बचत वापस परिणाम हैं

<xhtml:html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml"> 
    <xhtml:head> 
    <xhtml:title>Example</xhtml:title> 
    </xhtml:head> 
    <xhtml:body> 
    <xhtml:h1>Example</xhtml:h1> 
    </xhtml:body> 
</xhtml:html> 

तो मार्कअप विवरण की उम्मीद नहीं है जब संरक्षित करने की XDocument/XElement के साथ लोड/सहेजना।

+1

उपयोग कर सकते हैं के शीर्षक में घोषणा से बचने के लिए तो मुझे लगता है कि कम जवाब है, "आप नहीं कर सकते"। :( – RandomEngy

1

दस्तावेज़ आप निम्नलिखित

XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.OmitXmlDeclaration = true; 


     using (XmlWriter xw = XmlWriter.Create(fileName, settings)) 
     { 
      doc.Save(xw); 
     }