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
'program tip' 카테고리의 다른 글
dplyr로 특정 값을 NA로 설정 (0) | 2021.01.11 |
---|---|
`Object`는 JavaScript의 함수입니까? (0) | 2021.01.11 |
C # 분산 문제 : 목록 할당 (0) | 2021.01.10 |
Go에서 크기 조정이 가능한 배열을 구현하는 방법 (0) | 2021.01.10 |
Makefile 문제 : 디렉토리 트리에서 .c 파일을 스캔하는 현명한 방법 (0) | 2021.01.10 |