2012-07-12 25 views
6

tôi cần phải viết một đoạn XML để được tiêu thụ bởi một dịch vụ web. Bất kỳ khai báo xml nào cũng làm cho dịch vụ web từ chối yêu cầu. Để hỗ trợ điều này tôi có lớp sau:Viết một đoạn XML sử dụng XmlWriterSettings và XmlSerializer là cho một nhân vật phụ

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

mà cho phép tôi để thiết lập các tiêu chuẩn yêu cầu và sau đó nhận được kết quả.

Mã này được sử dụng như thế này:

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

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

Khi tôi serialize này vào một file XML tôi nhận được một câu trả lời thích hợp, mà không cần khai báo XML hoặc bất kỳ không gian tên. Tuy nhiên, tôi thà nắm bắt dữ liệu trong một dòng bộ nhớ hơn là một tập tin.

Sử dụng phương pháp sau (lấy từ http://www.codeproject.com/Articles/58287/XML-Serialization-Tips-Tricks) tôi có thể đạt được kết quả, nhưng đối với một số lý do tôi có một? được liệt kê như là một phần của chuỗi.

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()); 

} 

chuỗi kết quả là:

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

nếu tôi đặt OmitXmlDeclaration = false tôi nhận được chuỗi sau:

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

bất cứ ai có thể giúp tôi xác định lý do tại sao phụ? ở đó và làm thế nào tôi có thể loại bỏ nó?

phương pháp làm việc SerializeToString không có 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

vui nó trông giống như một phần của việc kê khai XML còn lại trong, hoặc đó hoặc một vấn đề mã hóa - bạn đã thử bất kỳ mã hóa khác vì tò mò? – Charleh

+0

đó là những gì tôi nghĩ là tốt, nhưng tôi đã cố gắng cả UTF8 và unicode cho mã hóa với kết quả tương tự. –

+0

Nếu bạn thay đổi OmitXmlDeclaration false nào nó hoạt động (tất nhiên bạn sẽ có được khai báo XML nhưng không cho nó xuất XML ok?) – Charleh

Trả lời

3

Bạn đang nhìn thấy BOM (byte để mặt nạ) là ký tự đầu tiên trong chuỗi của bạn chuyển đổi từ mảng byte luồng của.

Tắt xuất ra BOM và bạn sẽ ổn thôi.

Sử dụng đối tượng mã hóa mà không tạo ra BOM: UnicodeEncoding

settings.Encoding = new UnicodeEncoding(bigEndian:false,byteOrderMark:true) 
Các vấn đề liên quan