2009-09-15 5 views
12

는 내 객체를 직렬화하기 위해이 방법을 사용하고 있습니다 :<?xml ?> .NET에서 xml serialization의 일부를 제어하는 ​​방법은 무엇입니까?

public static string XmlSerialize(object o) 
{ 
    var stringWriter = new StringWriter(); 
    var xmlSerializer = new XmlSerializer(o.GetType()); 
    xmlSerializer.Serialize(stringWriter, o); 
    string xml = stringWriter.ToString(); 
    stringWriter.Close(); 
    return xml; 
} 

은 다음과 같이 시작 XML을 만드는 :

<?xml version="1.0" encoding="utf-16"?> 
<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

하지만 그것은 다음과 같이 할 :

<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?> 
<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

그렇다면 인코딩을 Windows-1252로 변경하고 standalone = yes로 설정하는 방법은 무엇입니까? 또한 xmlns 값을 제외하도록 객체를 가져 오는 방법은 무엇입니까?

this one과 같은 몇 가지 비슷한 질문을 보았습니다.하지만 나에게 어쩌면 어딘가에 어떤 속성을 설정하면 더 간단 할 것 같았습니까?

업데이트 2 : John의 대답과 의견을보고 나서 이것에 대해 더 생각한 후에 두 번째 방법을 만들기로했습니다. 한 번에 제 3자를 위해이 엉뚱한 사용자 지정 XML을 만드는 것이 처음부터 "XmlSerialize"와 같은 일반적인 것으로 호출되어야한다고 생각하지 않습니다.

그래서, XML 문서를 취하는 두 번째 방법을 만들어 먼저,이 같은 네임 스페이스 요소 제거 : 그것은 그것은 요한의 코드와 XML에 기록, 다음

xElement.Attributes().Where(a => a.IsNamespaceDeclaration && a.Value == "http://www.w3.org/2001/XMLSchema").Remove(); 

합니다.

new XDeclaration("1.0", "Windows-1252", "yes").ToString() 

을 그리고 그 추한하지만, 정확히 내가 XML을 이해하기 위해 제 3 자에 필요한 걸 가져옵니다 마지막으로이의 출력 다음, 그 XML을 반환합니다.

+0

정말 'XmlTextReader'와'XmlTextWriter' 대신'XmlReader.Create'와'XmlWriter.Create'를 사용하십시오. 또한 이러한 것들을'using '블록에 넣을 필요가 있습니다. –

+0

궁극적으로 나는 당신의 코드를 가지고 갔다. 그러나 모든 것이 닫히는 한 블록을 사용하는 것만 큼 좋은 점이 아닌가 궁금합니다. – Chris

+0

아니요. '사용'블록은 예외가 발생하더라도 개체가 삭제되었는지 확인합니다. –

답변

25

이 시도 네임 스페이스, 그러나, 당신은 왜 하시겠습니까?


업데이트 : 그것은 당신이 StringWriter를 사용할 때마다, 당신은 당신이 인코딩 세트와 그 위에 상에 XmlWriter를 사용하는 경우에도 UTF-16받을 것으로 보인다. 다음 단계는 MemoryStream으로 작성하는 것입니다. 그러나 그것은 왜 문자열을 반환하기를 원하는지에 대한 질문을 제기합니다. 예를 들어, 문자열을 뒤집어 스트림으로 출력하려는 ​​경우이 스트림에 직접 출력해야합니다. TextWriter과 동일합니다.

+0

나는 API를 사용하고 있으며 xsd가 거기에 없어야한다고 지정했다. 왜 그들은 그것을 원하지 않고 왜 그것을 무시할 수 없는지 나는 잘 모른다. – Chris

+0

John, XML 선언을 없애고 싶지 않습니다. 나는 그것을 지키고 출력되는 것을 바꾸고 싶다. – Chris

+2

OmitXmlDeclaration = true를 없애고 선언을 다시 받아야합니다. xsd 선언문에 질식하는 경우 API 사용자 **를 정말 열심히 ** 차버 릴 필요가 있습니다. xsi : type을 지정해야하는 경우 필요합니다. 우리 모두가 표준을 따르지 않는다면, XML은 곧 표준이 될 수 없습니다. –

2

StringWriter 대신 XmlTextWriter을 사용할 수 있습니다. 다음은 인코딩 세트가있는 일부 코드의 일부입니다. 이것은 XSD 제거되지 않습니다

public static string XmlSerialize(object o) 
{ 
    using (var stringWriter = new StringWriter()) 
    { 
     var settings = new XmlWriterSettings 
          { 
           Encoding = Encoding.GetEncoding(1252), 
           OmitXmlDeclaration = true 
          }; 
     using (var writer = XmlWriter.Create(stringWriter, settings)) 
     { 
      var xmlSerializer = new XmlSerializer(o.GetType()); 
      xmlSerializer.Serialize(writer, o); 
     } 
     return stringWriter.ToString(); 
    } 
} 

:

XmlTextWriter textWriter = new XmlTextWriter(stream, Encoding.GetEncoding(1252)); 
textWriter.Namespaces = false; 
+3

.NET 2.0에서 'XmlTextWriter'를 더 이상 사용하지 않아야합니다. –

0

FWIW, XMLWriterSettings와 함께 XmlWriter를 사용하여 작업 할 인코딩이 있습니다. 다음은 샘플입니다 :

... 
// My object type was from a class generated by xsd. 
XmlSerializer xms = new XmlSerializer(typeof(SomeType)); 
SomeType objSt; 
using(FileStream fs = new FileStream("C:\SomeFile.xml", FileMode.Open, FileAccess.Read)) 
{  
    using(XmlReader xr = XmlReader.Create(fs)) // Supposed to preserve encoding. 
    { 
    objSt = (SomeType)xms.Deserialize(xr); 
    }  
} 

... 
... // Do some stuff, change some attribute values. 
... 

XmlWriterSettings xsw= new XmlWriterSettings(); 
xsw.Indent= true; 
xsw.NewLineOnAttributes= true; 
xsw.Encoding = Encoding.GetEncoding(1252); 
using(XmlWriter xwXsw = XmlWriter.Create("C:\SomeFile_Changed.xml",xsw)) 
{  
    xms.Serialize(xwXsw, objSt); 
} 
... 
... // Finish up and get out. 
... 

어떤 이유는, 나는 "모든 것이 XmlSerializer.Deserialize (XmlReader를)위한 MS의 도움에 따라 이후 한 번 그냥 XmlSerializer를 개체를 사용하고 TextWriter를 함께 직렬화 작업을 얻을 수 있었다 XmlReader는 XML 문서에 지정된 인코딩을 자동으로 감지하고 사용합니다. " 그런 다음 XmlWriterSettings를 가지고 놀기 시작하고 뭔가를 깨뜨 렸습니다.

+0

FileStream,'XmlReader' 및'XmlWriter'를'using' 블록에 넣지 않기 때문에 -1입니다. –

+0

멋지다 - 그러나 주석에는 "예외 처리가 없거나" "using"이 명시되어 있습니다. 오래 전에 내가 왜 그렇게했는지 잘 모르겠다. 당신의 감정을 상하게하는 것을 의미하지 않았다 :) – GTAE86

+0

어떤 의견을 말하는거야? –

관련 문제