2010-05-14 9 views
6

나는 모든 요소는 다음과 같이 접두사와 XML 파일을 만들 수 있습니다XmlSerializer를 일으키기 XML 네임 스페이스 접두사

<ps:Request num="123" xmlns:ps="www.ladieda.com"> 
    <ps:ClientId>5566</ps:ClientId> 
<ps:Request> 

난 내 개체를 직렬화, C#을 스마트하고이 수행합니다

<Request num="123" xmlns="www.ladieda.com"> 
    <ClientId>5566</ClientId> 
<Request> 

ps :가 필요하지 않기 때문에 좋습니다.

그러나 C#에서 모든 접두사를 직렬화하도록 강제하는 방법이 있습니까? 당신의 문자열의 소비자가 XML을 처리 한 경우는 아무튼 이후의 모든의

String XmlizedString = null; 
MemoryStream memoryStream = new MemoryStream(); 
XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 

xs.Serialize(xmlTextWriter, pObject); 
memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); 
return XmlizedString; 


private String UTF8ByteArrayToString(Byte[] characters) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    String constructedString = encoding.GetString(characters); 
    return (constructedString); 
} 
+0

BTW, 그것은 당신의 네임 스페이스를 잊고 아니에요. 네임 스페이스가 올바르게 serialize됩니다. 단순히 접두사를 사용하지 않고 있습니다. 접두사를 사용하지 않기 때문에 접두사를 사용하는 것이 좋습니다. –

답변

15

첫째, 그들은이 접두사 걱정하지 않을 :

내 직렬화 코드는이 (수신 객체 pObject 용)입니다 (XML로) 중요하지 않습니다. 아마 그들은 XML을 이해하지 못하고 문자열을 처리하고 있다고 생각합니다 (모든 요소에 문자열 "ps :"가 있어야 할 수도 있음). 사용되지 않는하여 XmlTextWriter 클래스를 사용하여

XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings() 
    { 
     Encoding = Encoding.UTF8 
    }; 
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) 
    { 
     xs.Serialize(writer, pObject); 
    } 
    return Encoding.UTF8.GetString(memoryStream.ToArray()); 
} 

예외가 발생하면이 제대로 스트림 및 XmlWriter를 처분 것, 중지, 아직 여전히 반환 : 모든

둘째, 당신은 당신의 코드를 약간 수정해야한다 UTF-8 용으로 작성된 XML을 포함하는 문자열.

마지막으로, 접두사를 제어하기 위해, "How to: Qualify XML Element and XML Attribute Names"를 참조하십시오

XmlSerializerNamespaces myNamespaces = new XmlSerializerNamespaces(); 
myNamespaces.Add("ps", "www.ladieda.com"); 

XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings() 
    { 
     Encoding = Encoding.UTF8 
    }; 
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) 
    { 
     xs.Serialize(writer, pObject, myNamespaces); 
    } 
    return Encoding.UTF8.GetString(memoryStream.ToArray()); 
} 
+2

+1 우수한 답변 - 좋은 설명과 좋은, 쉽게 따라 할 수있는 코드 샘플. –

+0

좋아요! 이것은 밖으로 작동합니다! 고마워. – Michel

+0

아주 이상 :이 코드는 디버거에서 보이지 않는 문자를 xml 문자열의 첫 번째 문자로 생성합니다. 보이지 않는 문자가 인코딩되기 때문에이 문자가없는 동일한 문자열과 비교하거나 팝업을 html.encode하는 경우에만 팝업됩니다. 그것은 단지 1 문자, 그리고 지금까지는 그것을 벗겨내는 것입니다. – Michel

0

는 또한 XmlNamespaceDeclarationsAttribute을 확인하십시오. 주의 사항 : 비 직렬화는 요소에 정의 된 네임 스페이스 만 제공하며 부모 요소에는 네임 스페이스가 정의되지 않습니다. 일관된 루트 유형이 없다면 @ John Saunders의 XmlSerializer.Serialize() 오버로드를 사용하십시오. 또 다른 질문 @ 존 손더스에서

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlnamespacedeclarationsattribute.aspx

는 WSDL에서 제어의 xmlns에 관해서이 속성을 사용하여 제안 : Namespace Prefixes in Wsdl (.net)

MSDN 샘플에서 :

// C# 
using System; 
using System.IO; 
using System.Xml.Serialization; 
[XmlRoot("select")] 
public class Select { 
    [XmlAttribute] public string xpath; 
    [XmlNamespaceDeclarations] public XmlSerializerNamespaces xmlns; 
} 
public class Test { 
    public static void Main(string[] args) { 
     Select mySelect = new Select(); 
     mySelect.xpath = "myNS:ref/@common:y"; 
     mySelect.xmlns = new XmlSerializerNamespaces(); 
     mySelect.xmlns.Add("MyNS", "myNS.tempuri.org"); 
     mySelect.xmlns.Add("common", "common.tempuri.org"); 
     XmlSerializer ser = new XmlSerializer(typeof(Select)); 
     ser.Serialize(Console.Out, mySelect); 
    } 
} 
// Output: 
// <?xml version="1.0" encoding="IBM437"?> 
// <select xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmln:xsi="http://www.w3.org/2001/XMLSchema-instance" 
// xmlns:common="common.tempuri.org" xmlns:MyNS="myNS.tempuri.org" xpath="myNS:ref/@common:y" />