अनुकूल XML स्ट्रिंग मुद्रित करने के लिए XML स्ट्रिंग प्रारूपित करें


178

मेरे पास एक XML स्ट्रिंग है जैसे:

<?xml version='1.0'?><response><error code='1'> Success</error></response>

एक तत्व और दूसरे के बीच कोई रेखाएँ नहीं हैं, और इस प्रकार पढ़ना बहुत मुश्किल है। मैं एक फ़ंक्शन चाहता हूं जो उपरोक्त स्ट्रिंग को प्रारूपित करता है:

<?xml version='1.0'?>
<response>
<error code='1'> Success</error>
</response> 

मैन्युअल रूप से फ़ंक्शन फ़ंक्शन को लिखने का सहारा लेने के बिना, क्या कोई .Net लाइब्रेरी या कोड स्निपेट है जिसे मैं ऑफहैंड का उपयोग कर सकता हूं?


1
सीएमएस के लिए सहारा, सवाल एक डुप्लिकेट है stackoverflow.com/questions/203528
स्पेंस

2
नकल नहीं है। यह एक निर्दिष्ट करता है XmlDocumentजो इस प्रश्न पर सबसे अधिक वोट किए गए उत्तर को अयोग्य घोषित करेगा।
१५

जवाबों:


185

उपयोग करें XmlTextWriter...

public static string PrintXML(string xml)
{
    string result = "";

    MemoryStream mStream = new MemoryStream();
    XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode);
    XmlDocument document = new XmlDocument();

    try
    {
        // Load the XmlDocument with the XML.
        document.LoadXml(xml);

        writer.Formatting = Formatting.Indented;

        // Write the XML into a formatting XmlTextWriter
        document.WriteContentTo(writer);
        writer.Flush();
        mStream.Flush();

        // Have to rewind the MemoryStream in order to read
        // its contents.
        mStream.Position = 0;

        // Read MemoryStream contents into a StreamReader.
        StreamReader sReader = new StreamReader(mStream);

        // Extract the text from the StreamReader.
        string formattedXml = sReader.ReadToEnd();

        result = formattedXml;
    }
    catch (XmlException)
    {
        // Handle the exception
    }

    mStream.Close();
    writer.Close();

    return result;
}

7
यह काम करता है यदि आप उस कोड के साथ काम कर रहे हैं जो .NET फ्रेमवर्क प्री-लाइनक्यू के पुराने संस्करण पर है, लेकिन दूसरा उदाहरण बहुत क्लीनर है।
माइक

8
माइक की टिप्पणी को स्पष्ट करने के लिए: LINQ को .NET 3.5 में पेश किया गया था। इसलिए यदि आप .NET (संस्करण 1, 1.1, 2 या 3.0) से पुराने .NET के संस्करण का उपयोग कर रहे हैं तो आपको इस उत्तर का उपयोग करना होगा। लेकिन अगर आप .NET 3.5 का उपयोग कर रहे हैं या बाद में चार्ल्स प्रकाश दासारी का उत्तर बहुत सरल है।
सिमोन तेवेसी

1
@SM कामरान मैं आपके कोड का उपयोग कर रहा हूं, लेकिन मुझे त्रुटि दिख रही है जैसे {"बंद स्ट्रीम तक नहीं जा सकता।"} लेखक पर। क्लिक करें (); pls समाधान दें।
जतिन गढ़िया

@ जतिनगढिय़ा के पास भी यही समस्या थी और मैंने धाराओं को परिभाषित करने में {ब्लॉक का उपयोग करके] इसका समाधान किया। इस तरह से आपको मैन्युअल रूप से स्ट्रीम को बंद करने की आवश्यकता नहीं है और उपयोग ब्लॉक के अंत तक पहुंचने पर धाराएं अपने आप बंद हो जाएंगी।
वाहिद फराहमंदियन

312

आपको किसी तरह सामग्री को पार्स करना होगा ... मुझे लगता है कि इसे करने के लिए सबसे आसान तरीका LINQ का उपयोग करना है। फिर, यह सब आपके सटीक परिदृश्य पर निर्भर करता है। यहाँ एक इनपुट XML स्ट्रिंग को प्रारूपित करने के लिए LINQ का उपयोग करके एक कार्यशील उदाहरण दिया गया है।

string FormatXml(string xml)
{
     try
     {
         XDocument doc = XDocument.Parse(xml);
         return doc.ToString();
     }
     catch (Exception)
     {
         // Handle and throw if fatal exception here; don't just ignore them
         return xml;
     }
 }

[बयानों का उपयोग संक्षिप्तता के लिए किया जाता है]


क्या यह कड़ाई से लाइन-ब्रेक और इंडेंटेशन को प्रभावित करने वाला है? मुझे कोई अन्य परिवर्तन नहीं चाहिए, जैसे "0" को "0.0" आदि में बदल दिया जाना चाहिए। जब ​​सभी व्हाट्सएप को हटा दिया जाता है, तो मैं चाहता हूं कि छीन लिया गया परिणाम-स्ट्रिंग बिल्कुल उसी तरह हो जैसे कि इनपुट-स्ट्रिंग।
रेडिम सर्नज

3
@ अरीम हाँ। वास्तविक डेटा में कोई बदलाव नहीं किया जाएगा। केवल टैग फ़ॉर्मेट और इंडेंट किए जाएंगे।
चार्ल्स प्रकाश दसारी

2
मैंने देखा है कि यह UTF8 के साथ अच्छी तरह से काम करता है, लेकिन यूनिकोड XML फ़ाइल सामग्री के साथ नहीं।
नयन

1
@SteveWellens, आप इसके बजाय doc.Declaration.ToString() + doc.ToString()या के माध्यम से घोषणा का उपयोग कर सकते doc.Saveहैं doc.ToString। देखें इस लिंक अधिक जानकारी के लिए।
डेविड फ्रांसीसी

1
नामस्थान सहित सुझाव दें क्योंकि यह उपयोगकर्ताओं को एक ऐसे वर्ग के लिए नामस्थान देखने से रोकता है जिसका उपयोग उन्होंने बहुत पहले नहीं किया होगा। System.Xml.Linq का उपयोग कर; अच्छी तरह से काम करता है धन्यवाद!
स्कॉट मोनिज़

61

यह एक, क्रिस्टोफरजोन से बेहतर है:

  1. इसे XML दस्तावेज़ हेडर की भी आवश्यकता नहीं है।
  2. स्पष्ट अपवाद हैं
  3. अतिरिक्त व्यवहार विकल्प जोड़ता है: OmitXmlDeclaration = true, NewLineOnAttributes = true
  4. कोड की कम लाइनें

    static string PrettyXml(string xml)
    {
        var stringBuilder = new StringBuilder();
    
        var element = XElement.Parse(xml);
    
        var settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;
        settings.Indent = true;
        settings.NewLineOnAttributes = true;
    
        using (var xmlWriter = XmlWriter.Create(stringBuilder, settings))
        {
            element.Save(xmlWriter);
        }
    
        return stringBuilder.ToString();
    }

टोड, क्या आप स्पष्ट कर सकते हैं कि "XML दस्तावेज़ हेडर की आवश्यकता नहीं है" से आपका क्या मतलब है? मैंने चार्ल्स प्रकाश दसारी के समाधान की कोशिश की है और सिर्फ एक्सएमएल घोषणा के बिना XML टुकड़े में पारित किया है (अर्थात <?xml version="1.0" encoding="UTF-8" ?>शीर्ष पर लाइन के बिना ) और यह ठीक काम किया।
बजे साइमन टवेसी

3
स्वीकृत उत्तर की तुलना में। चार्ल्स की तुलना में, यह बेहतर विन्यास होगा। हालाँकि, मैं शायद भविष्य में खुद चेरिस पद्धति का उपयोग करूँगा, इस तरह की विन्यासता एक दुर्लभ आवश्यकता होगी।
टॉड

1
यह एक बहुत बेहतर और छोटा है
एलेक्स जोलीग

8

सरल समाधान जो मेरे लिए काम कर रहा है:

        XmlDocument xmlDoc = new XmlDocument();
        StringWriter sw = new StringWriter();
        xmlDoc.LoadXml(rawStringXML);
        xmlDoc.Save(sw);
        String formattedXml = sw.ToString();

यह एक xml फ़ाइल बनाता है <? xml संस्करण = "1.0" एन्कोडिंग = "utf-16"?> इसके हेडर के रूप में। यह XmlSerializer द्वारा पार्स नहीं किया गया था, त्रुटि के साथ 'कोई यूनिकोड बाइट ऑर्डर मार्क नहीं है'। एन्कोडिंग को हटाने के लिए फिक्स था = "utf-16", देखें: stackoverflow.com/questions/29915467/…
डेक्कन टेलर

6

निम्नलिखित लिंक की जाँच करें: एक्सएमएल को कैसे प्रिंट करें (दुर्भाग्य से, लिंक अब 404 :( लौटाता है)

लिंक में विधि एक तर्क के रूप में XML स्ट्रिंग लेती है और एक अच्छी तरह से गठित (इंडेंटेड) XML स्ट्रिंग लौटाती है।

मैंने इस उत्तर को अधिक व्यापक और सुविधाजनक बनाने के लिए लिंक से नमूना कोड की प्रतिलिपि बनाई।

public static String PrettyPrint(String XML)
{
    String Result = "";

    MemoryStream MS = new MemoryStream();
    XmlTextWriter W = new XmlTextWriter(MS, Encoding.Unicode);
    XmlDocument D   = new XmlDocument();

    try
    {
        // Load the XmlDocument with the XML.
        D.LoadXml(XML);

        W.Formatting = Formatting.Indented;

        // Write the XML into a formatting XmlTextWriter
        D.WriteContentTo(W);
        W.Flush();
        MS.Flush();

        // Have to rewind the MemoryStream in order to read
        // its contents.
        MS.Position = 0;

        // Read MemoryStream contents into a StreamReader.
        StreamReader SR = new StreamReader(MS);

        // Extract the text from the StreamReader.
        String FormattedXML = SR.ReadToEnd();

        Result = FormattedXML;
    }
    catch (XmlException)
    {
    }

    MS.Close();
    W.Close();

    return Result;
}

2
मेरे लिए बहुत अच्छा काम करता है, मैंने इसे स्ट्रिंग का एक विस्तार तरीका बनाया है। इसके अलावा वह वेबसाइट नीचे है, इसलिए यह अच्छा है कि आपने एक कॉपी
छीन ली

1
डुप्लिकेट उत्तर। @एसएम कामरान भी यही जवाब देते हैं।
वाहिद फरहमानियन

@VahidFarahmandian हां। मैं इसके बारे में ज्यादा कुछ नहीं कर सकता था क्योंकि मैंने उनसे 1 मिनट पहले पोस्ट किया था :) BTW, मैं यह जोड़ने की कोशिश कर रहा था कि ब्लॉग पोस्टर को क्रेडिट देने के लिए उत्तर कहां से आया। दुर्भाग्य से, लिंक अब टूट गया है :(।
चांसिक इम

मुझे यह उत्तर चार्ल्स (फॉर्मेटक्लेम) और टॉड (प्रिटीएक्सएमएल) की तुलना में सबसे अच्छा लगता है, क्योंकि यह उत्तर <?xml...?>लाइन को अलग नहीं करता है । यह उत्तर मुझे वही मिलता है जो मूल रूप से मेरे मन में था। केवल नकारात्मक यह होगा कि मैं मूल रूप से उपयोग किए जाने वाले स्थानों के बजाय टैब को प्राथमिकता दूंगा। मैंने सेट किया Indentation = 1और IndentChar = '\t'ठीक वैसा ही पाने के लिए जैसा मैं चाहता था।
सारा वेनबर्गर

@ CHICoder007 विस्तार विधि के बारे में टिप्पणी के लिए धन्यवाद। आपने मुझे कुछ नया सिखाया है। एक (this String XML)महान काम में जोड़ना ।
सारा वेनबर्गर

4

मैंने कोशिश की:

internal static void IndentedNewWSDLString(string filePath)
{
    var xml = File.ReadAllText(filePath);
    XDocument doc = XDocument.Parse(xml);
    File.WriteAllText(filePath, doc.ToString());
}

यह अपेक्षा के अनुरूप काम कर रहा है।


लेकिन यह <? xml?> टैग को शीर्ष पर हटा देता है
जुरन

2

.NET 2.0 की अनदेखी करने वाले नाम, और उचित संसाधन-निपटान, इंडेंटेशन, संरक्षित-व्हाट्सएप और कस्टम एन्कोडिंग के साथ :

public static string Beautify(System.Xml.XmlDocument doc)
{
    string strRetValue = null;
    System.Text.Encoding enc = System.Text.Encoding.UTF8;
    // enc = new System.Text.UTF8Encoding(false);

    System.Xml.XmlWriterSettings xmlWriterSettings = new System.Xml.XmlWriterSettings();
    xmlWriterSettings.Encoding = enc;
    xmlWriterSettings.Indent = true;
    xmlWriterSettings.IndentChars = "    ";
    xmlWriterSettings.NewLineChars = "\r\n";
    xmlWriterSettings.NewLineHandling = System.Xml.NewLineHandling.Replace;
    //xmlWriterSettings.OmitXmlDeclaration = true;
    xmlWriterSettings.ConformanceLevel = System.Xml.ConformanceLevel.Document;


    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
    {
        using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(ms, xmlWriterSettings))
        {
            doc.Save(writer);
            writer.Flush();
            ms.Flush();

            writer.Close();
        } // End Using writer

        ms.Position = 0;
        using (System.IO.StreamReader sr = new System.IO.StreamReader(ms, enc))
        {
            // Extract the text from the StreamReader.
            strRetValue = sr.ReadToEnd();

            sr.Close();
        } // End Using sr

        ms.Close();
    } // End Using ms


    /*
    System.Text.StringBuilder sb = new System.Text.StringBuilder(); // Always yields UTF-16, no matter the set encoding
    using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(sb, settings))
    {
        doc.Save(writer);
        writer.Close();
    } // End Using writer
    strRetValue = sb.ToString();
    sb.Length = 0;
    sb = null;
    */

    xmlWriterSettings = null;
    return strRetValue;
} // End Function Beautify

उपयोग:

System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load("C:\Test.svg");
string SVG = Beautify(xmlDoc);

0

यदि आप XMLDoc को लोड करते हैं तो मुझे पूरा यकीन है .ToString () फ़ंक्शन इसके लिए एक अधिभार रखता है।

लेकिन क्या यह डिबगिंग के लिए है? इसका कारण यह है कि इस तरह भेजा जाता है कि कम जगह ले ली जाए (यानी एक्सएमएल से अप्राकृतिक व्हाट्सएप को अलग करना)।


0

UTF-8 XML घोषणा के साथ अनुकूलन सुंदर XML आउटपुट

निम्न वर्ग परिभाषा एक इनपुट XML स्ट्रिंग को स्वरूपित आउटपुट XML में xml घोषणा के साथ UTF-8 के रूप में परिवर्तित करने के लिए एक सरल विधि देती है। यह उन सभी कॉन्फ़िगरेशन विकल्पों का समर्थन करता है जो XmlWriterSettings वर्ग प्रदान करता है।

using System;
using System.Text;
using System.Xml;
using System.IO;

namespace CJBS.Demo
{
    /// <summary>
    /// Supports formatting for XML in a format that is easily human-readable.
    /// </summary>
    public static class PrettyXmlFormatter
    {

        /// <summary>
        /// Generates formatted UTF-8 XML for the content in the <paramref name="doc"/>
        /// </summary>
        /// <param name="doc">XmlDocument for which content will be returned as a formatted string</param>
        /// <returns>Formatted (indented) XML string</returns>
        public static string GetPrettyXml(XmlDocument doc)
        {
            // Configure how XML is to be formatted
            XmlWriterSettings settings = new XmlWriterSettings 
            {
                Indent = true
                , IndentChars = "  "
                , NewLineChars = System.Environment.NewLine
                , NewLineHandling = NewLineHandling.Replace
                //,NewLineOnAttributes = true
                //,OmitXmlDeclaration = false
            };

            // Use wrapper class that supports UTF-8 encoding
            StringWriterWithEncoding sw = new StringWriterWithEncoding(Encoding.UTF8);

            // Output formatted XML to StringWriter
            using (XmlWriter writer = XmlWriter.Create(sw, settings))
            {
                doc.Save(writer);
            }

            // Get formatted text from writer
            return sw.ToString();
        }



        /// <summary>
        /// Wrapper class around <see cref="StringWriter"/> that supports encoding.
        /// Attribution: http://stackoverflow.com/a/427737/3063884
        /// </summary>
        private sealed class StringWriterWithEncoding : StringWriter
        {
            private readonly Encoding encoding;

            /// <summary>
            /// Creates a new <see cref="PrettyXmlFormatter"/> with the specified encoding
            /// </summary>
            /// <param name="encoding"></param>
            public StringWriterWithEncoding(Encoding encoding)
            {
                this.encoding = encoding;
            }

            /// <summary>
            /// Encoding to use when dealing with text
            /// </summary>
            public override Encoding Encoding
            {
                get { return encoding; }
            }
        }
    }
}

आगे के सुधार के लिए संभावनाएँ: -

  • एक अतिरिक्त विधि GetPrettyXml(XmlDocument doc, XmlWriterSettings settings) बनाई जा सकती है जो कॉलर को आउटपुट को अनुकूलित करने की अनुमति देती है।
  • एक अतिरिक्त तरीका GetPrettyXml(String rawXml)जोड़ा जा सकता है जो क्लाइंट को XmlDocument का उपयोग करने के बजाय कच्चे पाठ को पार्स करने का समर्थन करता है। मेरे मामले में, मुझे XmlDocument का उपयोग करके XML को हेरफेर करने की आवश्यकता थी, इसलिए मैंने इसे नहीं जोड़ा।

उपयोग:

String myFormattedXml = null;
XmlDocument doc = new XmlDocument();
try
{
    doc.LoadXml(myRawXmlString);
    myFormattedXml = PrettyXmlFormatter.GetPrettyXml(doc);
}
catch(XmlException ex)
{
    // Failed to parse XML -- use original XML as formatted XML
    myFormattedXml = myRawXmlString;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.