program tip

DataContractSerializer에 의해 생성 된 XML 서식

radiobox 2021. 1. 11. 07:55
반응형

DataContractSerializer에 의해 생성 된 XML 서식


DataContractSerializer가 하나의 긴 문자열이 아닌 형식화 된 XML을 뱉어내는 쉬운 방법이 있습니까? 어떤 식 으로든 태그 나 내용을 변경하고 싶지 않습니다. XML을 더 읽기 쉽게 만들기 위해 줄 바꿈과 들여 쓰기 만 추가하면됩니까?

<tagA>
   <tagB>This is</tagB>   
   <tagC>Much</tagC>
   <tagD>
      <tagE>easier to read</tagE>
   </tagD>
</tagA>


<tagA><tagB>This is</tagB><tagC>Much</tagC><tagD><tagE>harder to read</tagE></tagD></tagA>

bendewey가 말했듯이 XmlWriterSettings는 필요한 것입니다.

var ds = new DataContractSerializer(typeof(Foo));

var settings = new XmlWriterSettings { Indent = true };

using (var w = XmlWriter.Create("fooOutput.xml", settings))
    ds.WriteObject(w, someFoos);

Indent재산을 보십시오XmlWriterSettings

업데이트 : 방법 : XmlWriter에서 출력 형식 지정에 대한 MSDN의 좋은 링크입니다 .

또한 다음은 샘플입니다.

class Program
{
    static void Main(string[] args)
    {
        var Mark = new Person()
        {
            Name = "Mark",
            Email = "mark@example.com"
        };

        var serializer = new DataContractSerializer(typeof(Person));

        var settings = new XmlWriterSettings()
        {
            Indent = true,
            IndentChars = "\t"
        };

        using (var writer = XmlWriter.Create(Console.Out, settings))
        {
            serializer.WriteObject(writer, Mark);
        }
        Console.ReadLine();
    }
}
public class Person
{
    public string Name { get; set; }
    public string Email { get; set; }
}

XML 문서에서 공백을 조정하는 데주의하십시오! 공백을 조정하면 인간이 XML을 더 쉽게 읽을 수 있지만 기계 구문 분석을 방해 할 수 있습니다.

XML 표준 에 따르면 공백은 기본적으로 중요합니다. 즉, XML에 관한 한 공백은 내용 입니다.

멋진 형식의 XML을 XML 문서 객체에 공급하면 공백이나 줄 바꿈이없는 버전과 다른 결과를 얻을 수 있습니다. 형식이 지정된 버전에 추가 텍스트 노드가 추가됩니다.

XML 공백 에 대한이 MSDN 기사 에는 공백 이 얼마나 까다로울 수 있는지 보여주는 몇 가지 예가 있습니다.

사람이 소비 할 목적으로 만 XML 형식을 지정하는 경우에는 중요하지 않습니다. 그러나 서식이 지정된 문서를 왕복하려고하면 문제가 발생할 수 있습니다.

DataContractSerializer 사용의 주요 주요 이점 중 하나는 개체를 직렬화하고 XML을 원활하게 역 직렬화하는 기능 이므로 일반적으로 추악한 출력은 그대로 두는 것이 가장 좋습니다.

일반적으로 출력을 NotePad ++에 붙여넣고 디버깅 목적으로 읽고 싶을 때 XML 정리 매크로를 실행합니다.


    public static string SerializeEntity<T>(T source)
    {
        using (MemoryStream ms = new MemoryStream())
        {

                NetDataContractSerializer serializer = new NetDataContractSerializer();
                serializer.Serialize(ms, source);
                return System.Text.Encoding.ASCII.GetString(ms.ToArray());

        }
    }

    public static T DeSerializeEntity<T>(string xml)
    {
        using (MemoryStream ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes(xml)))
        {
                NetDataContractSerializer serializer = new NetDataContractSerializer();
                return (T)serializer.Deserialize(ms);
        }
    }

XmlWriter를 사용하는 여기에 게시 된 다른 샘플을 기반으로 한 버전 ( http://ClipFlair.codeplex.com에서 제공 )은 스트림 (및 특정 Ionic.Zip 라이브러리)과 함께 작동하며 코드가 어떻게 작동하는지 보여줍니다. t 서식 적용 (조건부 컴파일 사용-서식없는 XML을 작성하려면 #define을 주석 처리)

#define WRITE_FORMATTED_XML

using System.Xml;

namespace ClipFlair.Windows
{

  public partial class BaseWindow : FloatingWindow
  {

    //...

    #if WRITE_FORMATTED_XML
    private static XmlWriterSettings XML_WRITER_SETTINGS = new XmlWriterSettings() { Indent=true, IndentChars="  "};
    #endif

    //...

    public virtual void SaveOptions(ZipFile zip, string zipFolder = "") //THIS IS THE CORE SAVING LOGIC
    {
      if (SavingOptions != null) SavingOptions(this, null); //notify any listeners

      View.Busy = true;
      try
      {
        ZipEntry optionsXML = zip.AddEntry(zipFolder + "/" + View.GetType().FullName + ".options.xml",
          new WriteDelegate((entryName, stream) =>
          {
            DataContractSerializer serializer = new DataContractSerializer(View.GetType()); //assuming current View isn't null
            #if WRITE_FORMATTED_XML
            using (XmlWriter writer = XmlWriter.Create(stream, XML_WRITER_SETTINGS))
              serializer.WriteObject(writer, View);
            #else
            serializer.WriteObject(stream, View);
            #endif
          }));
      }
      catch (Exception e)
      {
        MessageBox.Show("ClipFlair options save failed: " + e.Message); //TODO: find the parent window
      }
      finally
      {
        View.Busy = false; //in any case (error or not) clear the Busy flag
      }

      if (SavedOptions != null) SavedOptions(this, null); //notify any listeners
    }

    //...

  }

}

참조 URL : https://stackoverflow.com/questions/739114/formatting-of-xml-created-by-datacontractserializer

반응형