xmlserializer가 일반 xml 만 직렬화하도록하려면 어떻게해야합니까?


85

<?xml version="1.0" encoding="utf-16"?>시작 부분과 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema".NET의 첫 번째 요소 없이 일반 xml을 가져와야 XmlSerializer합니다. 어떻게하니?

답변:


211

이 모든 것을 종합하려면-이것은 나에게 완벽하게 작동합니다.

    // To Clean XML
    public string SerializeToString<T>(T value)
    {
        var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
        var serializer = new XmlSerializer(value.GetType());
        var settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.OmitXmlDeclaration = true;

        using (var stream = new StringWriter())
        using (var writer = XmlWriter.Create(stream, settings))
        {
            serializer.Serialize(writer, value, emptyNamespaces);
            return stream.ToString();
        }
    }

1
(var stream = new StringWriter ())를 사용하여 var stream = new StringWriter (); xmlwriter를 두 번 처리하기 때문에 코드 분석에 오류가 발생합니다.
Archna 2011

1
@Archna 그렇게하면 XmlWriter.Create 호출에서 예외가 발생하는 경우 StringWriter가 삭제되지 않습니다. Dispose를 두 번 실행해도 두 번째 호출에 대해 아무것도 수행하지 않는다는 보장을 준수하지 않는 IDispose 구현을 만드는 악의적 인 XmlWriter 작성자를 다루는 가능한 솔루션 using( writer )은 다음 질문에서 볼 수 있듯이 try catch 및에서 스트림을 null로 설정하는 것과 관련됩니다 . stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn

유형 매개 변수 T를 사용하는 용도는 무엇입니까?
Jesper

25

XmlSerializer.Serialize사용자 지정 네임 스페이스를 지정하고이를 전달할 수 있는 메서드 오버로드를 사용합니다 .

var emptyNs = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
serializer.Serialize(xmlWriter, objectToSerialze, emptyNs);

null 또는 빈 배열을 전달하는 것은 트릭을 수행하지 않습니다.


7
이 답변을 @tobsen의 답변과 결합하여 내가 요청한 것을 얻으려면-정말 깨끗한 xml!
Grzenio 2009.11.23


0

그러면 XML이 문자열 대신 파일에 기록됩니다. 객체 티켓은 내가 직렬화하는 객체입니다.

사용 된 네임 스페이스 :

using System.Xml;
using System.Xml.Serialization;

암호:

XmlSerializerNamespaces emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });

XmlSerializer serializer = new XmlSerializer(typeof(ticket));

XmlWriterSettings settings = new XmlWriterSettings
{
    Indent = true,
    OmitXmlDeclaration = true
};

using (XmlWriter xmlWriter = XmlWriter.Create(fullPathFileName, settings))
{
    serializer.Serialize(xmlWriter, ticket, emptyNamespaces); 
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.