2012-07-12 3 views
6

Ho bisogno di scrivere un frammento XML per essere utilizzato da un servizio web. Qualsiasi dichiarazione xml fa sì che il servizio Web respinga la richiesta. Per supportare questo ho la seguente classe:Scrittura di un frammento XML utilizzando XmlWriterSettings e XmlSerializer sta dando un carattere aggiuntivo

public class ContentQueryCriteria 
{ 
    public int Type { get; set; } 
    public string Value { get; set; } 
    public int Condition { get; set; } 
} 

che mi consente di impostare i criteri della richiesta e quindi ottenere i risultati.

Il codice viene utilizzato in questo modo:

ContentQueryCriteria content = new ContentQueryCriteria(); 
      content.Type = 1; 
      content.Value = "NAVS500"; 
      content.Condition = 1; 

      string requestBody = SerializeToString(content); 
      Console.WriteLine(requestBody); 

Quando ho serializzare questo in un file XML ottengo una risposta adeguata, senza la dichiarazione XML o qualsiasi namespace. Tuttavia, preferirei acquisire i dati in un flusso di memoria piuttosto che un file.

Utilizzando il seguente metodo (tratto da http://www.codeproject.com/Articles/58287/XML-Serialization-Tips-Tricks) sono in grado di ottenere risultati, ma per qualche motivo ho un? elencato come parte della stringa.

public static string SerializeToString(object obj) 
{ 
    XmlSerializer serializer = new XmlSerializer(obj.GetType()); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 

    MemoryStream ms = new MemoryStream(); 

    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.OmitXmlDeclaration = true; 
    settings.Encoding = Encoding.Unicode; 
    XmlWriter writer = XmlWriter.Create(ms, settings); 
    serializer.Serialize(writer, obj, ns); 

    return Encoding.Unicode.GetString(ms.ToArray()); 

} 

la stringa risultante è:

?<ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria> 

se ho impostato OmitXmlDeclaration = false ricevo la seguente stringa:

?<?xml version="1.0" encoding="utf-16"?><ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria> 

Qualcuno può aiutarmi a determinare il motivo per cui l'extra? c'è e come posso rimuoverlo?

Metodo di lavoro SerializeToString senza BOM

public static string SerializeToString(object obj) 
{ 
    XmlSerializer serializer = new XmlSerializer(obj.GetType()); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 
    MemoryStream ms = new MemoryStream(); 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.OmitXmlDeclaration = true; 
    settings.Encoding = new UnicodeEncoding(bigEndian: false, byteOrderMark: false); 
    XmlWriter writer = XmlWriter.Create(ms, settings); 
    serializer.Serialize(writer, obj, ns); 

    return Encoding.Unicode.GetString(ms.ToArray()); 


} 
+2

divertente sembra che parte della dichiarazione XML viene lasciato in, uno che o un problema di codifica - hai provato tutte le altre codifiche per curiosità? – Charleh

+0

è quello che pensavo anch'io, ma ho provato sia UTF8 che Unicode per la codifica con gli stessi risultati. –

+0

Se si modifica OmitXmlDeclaration su false funziona (ovviamente si ottiene la dichiarazione XML ma viene emesso ok XML?) – Charleh

risposta

3

Stai visualizzando BOM (byte maschera ordine) come primo carattere nella stringa convertito da matrice di byte di flusso.

Disattiva l'emissione di BOM e starai bene.

Usa oggetto di codifica che non genera BOM: UnicodeEncoding

settings.Encoding = new UnicodeEncoding(bigEndian:false,byteOrderMark:true)