2010-05-14 26 views
6

tôi phải tạo một tập tin XML với tất cả các yếu tố tiền tố, như thế này:XmlSerializer Sản xuất XML Với Không namespace prefix

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

Khi tôi serialize đối tượng của tôi, C# là thông minh và thực hiện điều này:

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

Điều đó là tốt, bởi vì ps: không cần thiết.

Nhưng có cách nào để buộc C# tuần tự hóa tất cả các tiền tố không?

đang sắp đặt của tôi là thế này (đối với đối tượng đến pObject):

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, nó không quên namespace của bạn. Không gian tên của bạn được tuần tự một cách chính xác. Nó chỉ đơn giản là không sử dụng một tiền tố, mà làm cho tinh thần, kể từ khi bạn không nói với nó một tiền tố để sử dụng. –

Trả lời

15

Trước hết, nếu người tiêu dùng của chuỗi của bạn đã được chế biến XML, sau đó họ sẽ không quan tâm đến tiền tố, vì nó doesn không quan trọng (với XML). Có lẽ họ không hiểu XML, và nghĩ rằng họ đang xử lý một chuỗi (có thể cần phải có chuỗi "ps:" trên mọi phần tử).

Thứ hai, bạn nên thay đổi mã của bạn một chút:

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

này sẽ xử lý đúng của con suối và XmlWriter nếu một ngoại lệ được ném ra, ngừng sử dụng lớp XmlTextWriter bị phản đối, nhưng vẫn trả về một chuỗi chứa XML được viết cho UTF-8.

Cuối cùng, để kiểm soát tiền tố, xem "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 câu trả lời xuất sắc - giải thích tuyệt vời và các mẫu mã tốt, dễ làm theo. –

+0

Tuyệt vời! Điều này hoạt động ra khỏi hộp! Cảm ơn bạn đời. – Michel

+0

Rất lạ: mã này tạo ký tự không hiển thị (trong trình gỡ rối) không phải là ký tự đầu tiên của chuỗi xml. Nó chỉ bật lên nếu bạn so sánh nó với cùng một chuỗi mà không có ký tự này, hoặc nếu bạn html.encode nó, bởi vì các nhân vật không nhìn thấy không được mã hóa. Đó là chỉ có 1 char, và workaround cho đến nay là để dải nó đi. – Michel

0

Ngoài ra kiểm tra XmlNamespaceDeclarationsAttribute. Lưu ý: khi deserializing nó sẽ chỉ cung cấp cho bạn các không gian tên được xác định bởi phần tử đó, nó sẽ không có các không gian tên được định nghĩa trong các phần tử cha. Nếu bạn không có kiểu gốc nhất quán thì hãy sử dụng quá tải XmlSerializer.Serialize() từ @John Saunders.

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

Trong một câu hỏi @ John Saunders cho thấy sử dụng thuộc tính này liên quan đến xmlns kiểm soát trong WSDL: Namespace Prefixes in Wsdl (.net)

Từ MSDN mẫu:

// 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" /> 
Các vấn đề liên quan