2008-10-12 19 views
40

मैं सी # में हल्का संपादक बना रहा हूं और एक स्ट्रिंग को अच्छी तरह से स्वरूपित XML स्ट्रिंग में परिवर्तित करने के लिए सबसे अच्छी विधि जानना चाहता हूं। मुझे आशा है कि सी # लाइब्रेरी में "सार्वजनिक बूल फॉर्मेटएक्सएक्सएमएल (स्ट्रिंग टेक्स्ट, आउट स्ट्रिंग फॉर्मेटेडएक्सएमएलटीक्स्ट)" में एक सार्वजनिक विधि है, लेकिन यह इतना आसान नहीं हो सकता है, है ना?सी # में, स्ट्रिंग को एक्सएमएल के रूप में प्रारूपित करने का सबसे अच्छा तरीका क्या है?

बहुत विशेष रूप से, "कुछ विधि" विधि क्या होगी जो नीचे उत्पादन का उत्पादन करेगी?

string unformattedXml; 
string formattedXml; 

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>" 
formattedXml = SomeMethod(unformattedXml); 

Console.WriteLine(formattedXml); 

आउटपुट:

<?xml version="1.0"?> 
    <book id="123"> 
    <author>Lewis, C.S.</author> 
    <title>The Four Loves</title> 
    </book> 

उत्तर

69
string unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"; 
string formattedXml = XElement.Parse(unformattedXml).ToString(); 
Console.WriteLine(formattedXml); 

आउटपुट:

<book> 
    <author>Lewis, C.S.</author> 
    <title>The Four Loves</title> 
</book> 

XML घोषणा, ToString() द्वारा उत्पादन नहीं है, लेकिन यह सेव() ...

XElement.Parse(unformattedXml).Save(@"C:\doc.xml"); 
    Console.WriteLine(File.ReadAllText(@"C:\doc.xml")); 

आउटपुट:

<?xml version="1.0" encoding="utf-8"?> 
<book> 
    <author>Lewis, C.S.</author> 
    <title>The Four Loves</title> 
</book> 
+0

धन्यवाद, यह वही है जो मैं बाद में था :) – thatuxguy

+0

ऐसा लगता है जैसे पार्स() विधि XML घोषणा के बिना स्ट्रिंग को पार्स नहीं करती है। –

0

स्ट्रिंग मान्य XML है? क्या आपका मतलब है कि आप एक्सएमएल स्ट्रिंग को एक्सएमएल दस्तावेज़ में कैसे परिवर्तित कर सकते हैं? यदि हां, तो ऐसा करते हैं:

XmlDocument xml = new XmlDocument(); 

xml.LoadXml(YourString); 
+1

क्या आपने दो या तीन अन्य उत्तरों को नहीं देखा जो सटीक बात कहें? – cjk

5

ऐसा लगता है कि आप एक XmlTextWriter वस्तुओं में एक्सएमएल लोड और प्रारूपण और इंडेंटेशन गुण सेट करना चाहते हैं:

writer.Formatting = Formatting.Indented; 
writer.Indentation = 1; 
writer.IndentChar = '\t'; 
+0

मैंने इस दृष्टिकोण को अतीत में (अपेक्षाकृत आसान) में उपयोग किया है, लेकिन .NET 2.0 और बाद में, माइक्रोसॉफ्ट अब XmlTextWrtierSettings क्लास का उपयोग करने की सलाह देता है ताकि आप 2.0 और 3.5 में जोड़े गए नए फीचर्स का लाभ उठा सकें। मेरे उत्तर में लिंक देखें। – Ash

15

दुर्भाग्य से नहीं, यह नहीं एक जितना आसान है FormatXMLForOutput विधि, यह माइक्रोसॉफ्ट यहां के बारे में बात कर रहा था;)

वैसे भी, .NET 2.0 के रूप में, अनुशंसित दृष्टिकोण XMlWriterSettingsClass का उपयोग फ़ॉर्मेटिंग सेट अप करने के लिए है, क्योंकि XmlTextWriter ऑब्जेक्ट पर सीधे गुणों को सेट करने के विपरीत। अधिक जानकारी के लिए See this MSDN page। यह कहता है:

".NET Framework संस्करण 2.0 रिलीज में, अनुशंसित अभ्यास XmlWriter का उपयोग कर XmlWriter उदाहरण बनाना है। क्रेट विधि और XmlWriterSettings क्लास। यह आपको प्रस्तुत की गई सभी नई सुविधाओं का पूर्ण लाभ लेने की अनुमति देता है । इस रिलीज अधिक जानकारी के लिए, एक्सएमएल राइटर्स बनाना देखें "

यहाँ की सिफारिश की दृष्टिकोण का एक उदाहरण है:।

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Indent = true; 
settings.IndentChars = (" "); 
using (XmlWriter writer = XmlWriter.Create("books.xml", settings)) 
{ 
    // Write XML data. 
    writer.WriteStartElement("book"); 
    writer.WriteElementString("price", "19.95"); 
    writer.WriteEndElement(); 
    writer.Flush(); 
} 
13

नई System.Xml.Linq नाम स्थान का उपयोग करना (System.Xml.Linq विधानसभा) आप निम्न का उपयोग कर सकते हैं:

string theString = "<nodeName>blah</nodeName>"; 
XDocument doc = XDocument.Parse(theString); 

तुम भी साथ एक टुकड़ा बना सकते हैं: स्ट्रिंग अभी तक एक्सएमएल नहीं है, तो

string theString = "<nodeName>blah</nodeName>"; 
XElement element = XElement.Parse(theString); 

, तो आप कुछ इस तरह कर सकते हैं: यह पिछले उदाहरण में नोट करने के लिए

string theString = "blah"; 
//creates <nodeName>blah</nodeName> 
XElement element = new XElement(XName.Get("nodeName"), theString); 

कुछ है XElement XML प्रदान की गई स्ट्रिंग एक्सकोड करेगा।

मैं अत्यधिक नई XLINQ कक्षाओं की अनुशंसा करता हूं। वे हल्के वजन वाले हैं, और उपयोगकर्ता के लिए आसान है कि मौजूदा XmlDocument- संबंधित प्रकारों में से अधिकांश।

1

तुम सिर्फ एक्सएमएल पात्रों से बचने के लिए की जरूरत है निम्नलिखित उपयोगी हो सकता है:

string myText = "This & that > <> &lt;"; 
myText = System.Security.SecurityElement.Escape(myText); 
4

जेसन का दृष्टिकोण सबसे सरल है।

private static string FormatXmlString(string xmlString) 
{ 
    System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString); 
    return element.ToString(); 
} 
+2

साथ ही 1 लाइन भी बना सकता है। – mpen

9

your're मान लिया जाये कि बस आप .NET 3.5 या सबसे अच्छा समाधान तो ऊपर प्रयोग कर रहे हैं, प्रारूप फिर से एक XML दस्तावेज नई लाइनों पर नए नोड्स डाल दिया और इंडेंट, तो जोड़ने के लिए इच्छुक: यहाँ विधि है XDocument के साथ आउटपुट का विश्लेषण करना है, कुछ:

string unformattedXml; 
string formattedXml; 

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"; 
formattedXml = System.Xml.Linq.XDocument.Parse(unformattedXml).ToString(); 

Console.WriteLine(formattedXml); 

नीट हू?

इसे फिर एक्सएमएल नोड्स को फिर से प्रारूपित करना चाहिए।

फ्रेमवर्क के पिछले संस्करणों के साथ ऐसा करने के लिए बहुत अधिक लेगवर्क की आवश्यकता होती है क्योंकि व्हाइटस्पेस की पुन: गणना करने के लिए फ़ंक्शंस में कोई भी निर्माण नहीं होता है।

वास्तव में, यह पूर्व Linq वर्गों का उपयोग करना होगा करने के लिए:

string unformattedXml; 
string formattedXml; 

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"; 
System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); 
doc.LoadXml(unformattedXml); 
System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(sb, new System.Xml.XmlWriterSettings() { Indent = true }); 
doc.WriteTo(xw); 
xw.Flush(); 
formattedXml = sb.ToString(); 
Console.WriteLine(formattedXml); 
0

System.Xml.Linq.XElement.ToString() स्वचालित रूप से प्रारूपित!

XElement formattedXML = new XElement.Parse(unformattedXmlString); 
Console.WriteLine(formattedXML.ToString()); 
1

फ्रेमवर्क 4.0 यह में सरल है।

var unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"; 
var xdoc = System.Xml.Linq.XDocument.Parse(unformattedXml); 
var formattedXml = (xdoc.Declaration != null ? xdoc.Declaration + "\r\n" : "") + xdoc.ToString(); 
Console.WriteLine(formattedXml); 

इस आवश्यक खरोज में जोड़ता है, और XML घोषणा बनाए रखता है।

<?xml version="1.0"?> 
<book> 
    <author>Lewis, C.S.</author> 
    <title>The Four Loves</title> 
</book> 
संबंधित मुद्दे

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