2012-01-07 23 views
28

क्या सी # कोड फ़ाइल के भीतर शाब्दिक एक्सएमएल डेटा जोड़ना संभव है? मैं वर्तमान में एक मल्टीलाइन स्ट्रिंग का उपयोग कर रहा हूं लेकिन जैसा कि आप देख सकते हैं, यह गन्दा हो जाता है। ऐसा करने का कोई बेहतर तरीका?सी # में एक्सएमएल अक्षरों का प्रयोग करें?

string XML = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<customUI xmlns=""http://schemas.example.com/customui""> 
    <toolbar id=""save""> 
    </toolbar> 
</customUI>"; 

उत्तर

37

XML literals VB.NET की एक विशेषता है, न कि सी # कर रहे हैं।

जो आपने पोस्ट किया है वह उतना करीब है जितना आप सी # में प्राप्त कर सकते हैं।

हालांकि आप एकल कोट्स के साथ एम्बेडेड डबल कोट्स को प्रतिस्थापित करने पर विचार करना चाहेंगे (क्योंकि दोनों प्रकार वैध XML हैं)।

एक्सएमएल की बड़ी मात्रा के लिए आप मार्क से जवाब पर विचार करना चाहेंगे - एक एक्सएमएल फ़ाइल (एक बार लोड और स्मृति में संग्रहीत) का उपयोग करके, ताकि आप एक्सएमएल संपादक का लाभ उठा सकें।

+8

यह उन दोनों भाषाओं में डेवलपर के रूप में उन कुछ समयों में से एक है जहां मैं वास्तव में एक विशेष वीबी.नेट सुविधा चाहता हूं। :) यह वीबीएनईटी में एक्सएमएल लिखना इतना साफ है, और धारावाहिक से बहुत तेज है। –

17

यदि एक्सएमएल रास्ते में आने के लिए काफी बड़ा है, तो इसके बजाय एक फ्लैट .xml फ़ाइल का उपयोग करने पर विचार करें, या तो डिस्क से लोड किया गया है, या संसाधन के रूप में एम्बेडेड है। जब तक आप इसे केवल एक बार लोड करते हैं (शायद एक स्थिर निर्माता में) इससे प्रदर्शन में कोई फर्क नहीं पड़ता। इसे बनाए रखना काफी आसान होगा, क्योंकि यह आईडीई के एक्सएमएल फ़ाइल संपादक का उपयोग करेगा। और यह आपके कोड के रास्ते में नहीं मिलेगा।

12

मेरी टिप्पणी के संदर्भ में, मुझे यह याद नहीं आया कि मैंने यह कहां देखा, लेकिन मुझे अंत में XmlBuilder link मिला।

पीछे की ओर, ऐसा लगता है कि एक्सएमएल के लिए लिंक आपकी सबसे अच्छी शर्त होगी। ,

XNamespace ns = "http://schemas.example.com/customui"; 
XDocument doc = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"), 
        new XElement(ns + "customUI", 
         new XElement(ns + "taskbar", 
          new XAttribute("id", "save")) 
        ) 
       ); 

var stringWriter = new StringWriter(); 
doc.Save(stringWriter); //Write to StringWriter, preserving the declaration (<?xml version="1.0" encoding="utf-16" standalone="yes"?>) 
var xmlString = stringWriter.ToString(); //Save as string 
doc.Save(@"d:\out.xml"); //Save to file 
5

एक अजीब के रूप में, और बहुत मामले विशेष समाधान यदि आप, रेजर इंजन का उपयोग कर एक ASP.NET वातावरण में काम करने से हो एक CSHTML में: यह तेजी से और अधिक एक्सएमएल तार श्रृंखलाबद्ध से पोषणीय क्लीनर है, फ़ाइल आप कर सकते हैं:

Func<MyType, HelperResult> xml = @<root> 
    <item>@(item.PropertyA)</item> 
    <item>@(item.PropertyB)</item> 
    <item>@(item.PropertyC)</item> 
</root>; 

एक विस्तार विधि के अलावा के साथ:

public static XDocument ToXDocument<T>(this Func<T, HelperResult> source, T item) 
{ 
    return XDocument.Parse(source(item).ToHtmlString()); 
} 

फिर आप कर सकते हैं:

XDocument document = xml.ToXDocument(new MyType() { 
    PropertyA = "foo", 
    PropertyB = "bar", 
    PropertyC = "qux", 
}); 

फिर से, अनोखा? हां। केस-विशिष्ट? हां। लेकिन यह काम करता है, और महान Intellisense देता है। (मन आप, यह भी वैधता चेतावनी का एक समूह, दे देंगे दस्तावेज़ मान्यता संस्करण के आधार पर)

+0

मुझे संदेह है कि मैं इसे अभ्यास में उपयोग करूंगा, लेकिन यह निश्चित रूप से एक बहुत ही आविष्कारक दृष्टिकोण है। कुडोस! –

0

निकटतम हम सी # में हो सकता था LINQ, ऐसा ही कुछ के माध्यम से होगा:

var xml = XDocument.Load(
    new StringReader(@"<Books> 
    <Book author='Dan Brown'>The Da Vinci Code</Book> 
    <Book author='Dan Brown'>The Lost Symbol</Book> 
    </Books>")); 

var query = from book in xml.Elements("Books").Elements("Book") 
    where book.Attribute("author").Value == "Dan Brown" 
    select book.Value; 

foreach (var item in query) Console.WriteLine(item); 
संबंधित मुद्दे