XML স্ট্রিং বন্ধুত্বপূর্ণ প্রিন্ট করতে XML স্ট্রিংটি ফর্ম্যাট করুন


178

আমার যেমন এক্সএমএল স্ট্রিং রয়েছে:

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

একটি উপাদান এবং অন্য মধ্যে কোন লাইন নেই, এবং এইভাবে পড়া খুব কঠিন। আমি একটি ফাংশন চাই যা উপরের স্ট্রিংটিকে ফর্ম্যাট করে:

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

নিজেই বিন্যাসটি বিন্যাস ছাড়াই নিজেই ফর্ম্যাটটি ফাংশন লিখুন, এমন কোনও নেট। লাইব্রেরি বা কোড স্নিপেট যা আমি অফহ্যান্ড ব্যবহার করতে পারি?


1
সিএমএসের কাছে প্রপস, প্রশ্নটি একটি সদৃশ স্ট্যাকওভারফ্লো.com
স্পেন্স

2
সদৃশ নয়। এটি একটি নির্দিষ্ট করে XmlDocumentযা এই প্রশ্নের সর্বোচ্চ ভোট প্রাপ্ত উত্তরকে অযোগ্য ঘোষণা করবে।
sirank

উত্তর:


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 ফ্রেমওয়ার্কের পূর্ব-লিনকিউডের পুরানো সংস্করণে থাকা কোডটি নিয়ে কাজ করে থাকেন তবে অন্য উদাহরণটি অনেক ক্লিনার।
মাইক 22

8
মাইকের মন্তব্য স্পষ্ট করার জন্য: .NET 3.5 এ লিনকিউ চালু হয়েছিল। সুতরাং আপনি যদি তার থেকেও পুরানো (নেট। 1, 1.1, 2 বা 3.0) সংস্করণ ব্যবহার করেন তবে আপনাকে এই উত্তরটি ব্যবহার করতে হবে। আপনি যদি .NET 3.5 বা তার পরে ব্যবহার করেন তবে চার্লস প্রকাশ দাসারীর উত্তরটি অনেক সহজ।
সাইমন তেউসি

1
@ এস এম কামরান আমি আপনার কোডটি ব্যবহার করছি তবে আমি ত্রুটি দেখতে পাচ্ছি {"একটি বদ্ধ স্ট্রিম অ্যাক্সেস করতে পারছি না" "writer লেখককে lo ক্লোজ (); pls সমাধান দিন।
যতীন গাধিয়া

@ যতিনগধিয়া আমারও একই সমস্যা ছিল এবং আমি স্ট্রিমগুলি সংজ্ঞায়িত করতে "ব্লক ব্যবহার করে" ব্যবহার করে এটি সমাধান করেছি। এইভাবে আপনাকে স্ট্রিমটি ম্যানুয়ালি বন্ধ করার দরকার নেই এবং ব্যবহারের ব্লকের শেষে পৌঁছালে স্ট্রিমগুলি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।
ওয়াহিদ ফারাহমানদিয়ান

312

আপনাকে কোনও উপায়ে পার্স করতে হবে ... আমি লিনকিউ এটির সবচেয়ে সহজ উপায় ব্যবহার করে দেখতে পাই। আবার, এটি আপনার নির্ভুল দৃশ্যের উপর নির্ভর করে। একটি ইনপুট এক্সএমএল স্ট্রিংটি ফর্ম্যাট করতে 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
আমি লক্ষ্য করেছি যে এটি ইউটিএফ 8 এর সাথে ভাল কাজ করেছে, তবে ইউনিকোড এক্সএমএল ফাইল সামগ্রীগুলির সাথে নয়।
নয়ন

1
@ স্টিভেলেনস, আপনি এর মাধ্যমে doc.Declaration.ToString() + doc.ToString()বা এর doc.Saveপরিবর্তে ব্যবহার করে এই ঘোষণাকে অ্যাক্সেস করতে পারেন doc.ToString। আরও তথ্যের জন্য এই লিঙ্কটি দেখুন ।
ডেভিড ফরাসী

1
নাম স্থানগুলি অন্তর্ভুক্ত করার পরামর্শ দিন কারণ এটি ব্যবহারকারীদের কোনও শ্রেণীর জন্য নাম স্থান সন্ধান করতে বাধা দেয় যা তারা আগে ব্যবহার করেন নি। System.XML.Linq ব্যবহার করে; ভাল কাজ করে ধন্যবাদ!
স্কট মনিজ

61

ক্রিস্টোফেরজহানসন থেকে নেওয়া এইটি আরও ভাল:

  1. এটির জন্য কোনও এক্সএমএল ডকুমেন্ট শিরোনাম প্রয়োজন হয় না।
  2. পরিষ্কার ব্যতিক্রম আছে
  3. অতিরিক্ত আচরণের বিকল্পগুলি যুক্ত করে: OmitXMLDeclaration = সত্য, NewLineOnAttributes = সত্য
  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 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 version = "1.0" এনকোডিং = "utf-16"?> এর শিরোনাম হিসাবে একটি এক্সএমএল ফাইল তৈরি করে। এটি 'ইউনিকোড বাইট অর্ডার চিহ্ন নেই' ত্রুটিযুক্ত করে এক্সএমএলসিরাইজার দ্বারা পার্স করা হয়নি। ঠিক করা ছিল এনকোডিং = "utf-16" অপসারণ করার জন্য, দেখুন: stackoverflow.com/questions/29915467/…
ডিক্লান টেলর

6

নিম্নলিখিত লিঙ্কটি দেখুন: কীভাবে এক্সএমএল প্রিন্ট করুন (দুর্ভাগ্যক্রমে, লিঙ্কটি এখন 404 :( ফেরায়)

লিঙ্কটিতে থাকা পদ্ধতিটি একটি আর্গুমেন্ট হিসাবে একটি এক্সএমএল স্ট্রিং নেয় এবং একটি সুগঠিত (অভিযুক্ত) এক্সএমএল স্ট্রিং দেয় returns

এই উত্তরটিকে আরও ব্যাপক এবং সুবিধাজনক করার জন্য আমি কেবলমাত্র লিঙ্কটি থেকে নমুনা কোডটি অনুলিপি করেছি।

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
সদৃশ উত্তর। @ এস এম কামরানও একই উত্তর পোস্ট করেছেন।
ওয়াহিদ ফারাহমানদিয়ান

নিবন্ধন করুন আমি এ সম্পর্কে খুব বেশি কিছু করতে পারিনি কারণ আমি তার চেয়ে 1 মিনিট আগে পোস্ট করেছি :) বিটিডাব্লু, আমি ব্লগের পোস্টারে ক্রেডিট দেওয়ার জন্য উত্তরটি কোথায় এসেছে তা যুক্ত করার চেষ্টা করছিলাম। দুর্ভাগ্যক্রমে, লিঙ্কটি এখন ভেঙে গেছে :(।
চানসিক ইম

চার্লস (ফরম্যাটএক্সএমএল) এবং টড (প্রেটিএক্সএমএল) এর একটির তুলনায় আমি এই উত্তরটি সবচেয়ে পছন্দ করি কারণ এই উত্তরটি <?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

আপনি যদি এক্সএমএলডোকটি লোড করেন তবে আমি নিশ্চিত যে .ToString () ফাংশনটিতে এর জন্য একটি ওভারলোড রয়েছে।

তবে এটি কি ডিবাগিংয়ের জন্য? এটি যেভাবে প্রেরণ করা হয়েছিল তা হ'ল কম জায়গা গ্রহণ করা (অর্থাত্ এক্সএমএল থেকে অযৌক্তিক সাদা স্থান সরিয়ে নেওয়া)।


0

ইউটিএফ -8 এক্সএমএল ঘোষণার সাথে কাস্টমাইজেবল প্রেটি এক্সএমএল আউটপুট

নিম্নলিখিত শ্রেণীর সংজ্ঞাটি একটি ইনপুট এক্সএমএল স্ট্রিংটিকে ইউটিএফ -8 হিসাবে এক্সএমএল ঘোষণার সাথে ফর্ম্যাট আউটপুট এক্সএমএলে রূপান্তর করতে একটি সহজ পদ্ধতি দেয়। এটি সমস্ত কনফিগারেশন বিকল্পগুলিকে সমর্থন করে যা এক্সএমএল রাইটারসেটেটিং ক্লাস অফার করে।

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)এক্সটেল পদ্ধতিটি যুক্ত করা যেতে পারে যা ক্লায়েন্টকে এক্সএমএল ডকুমেন্ট ব্যবহার না করে কাঁচা পাঠ্যকে পার্সিং সমর্থন করে। আমার ক্ষেত্রে, এক্সএমএল ডকুমেন্টটি ব্যবহার করে আমার এক্সএমএলকে চালিত করা দরকার, তাই আমি এটি যুক্ত করি নি।

ব্যবহার:

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.