2012-06-14 5 views
5

tôi cần phải tạo ra một cái gì đó như thế này:XML serialization + Namespaces (C#)

<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd"> 
<Header> 
... 
</Header> 
</AmazonEnvelope> 

Tôi đã cố gắng một cái gì đó như thế này nhưng nó không hoàn toàn chính xác:

XmlSerializerNamespaces nms = new XmlSerializerNamespaces(); 
     nms.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
     nms.Add("noNamespaceSchemaLocation", "amzn-envelope.xsd"); 



     XmlSerializer serializer = new XmlSerializer(typeof(XMLAmazonEnvelope)); 
     StreamWriter writer = new StreamWriter(path); 

     serializer.Serialize(writer, objectToSave,nms); 
     writer.Close(); 

Và kết quả là:

<?xml version="1.0" encoding="utf-8"?> 
<xsi:AmazonEnvelope xmlns:noNamespaceSchemaLocation="amzn-envelope.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<xsi:Header> 
... 
</xsi:Header> 
</xsi:AmazonEnvelope> 

Và điều này không chính xác những gì tôi muốn. Bất kỳ ý tưởng nào, nên làm gì khác nhau?

+1

'xsi: noNamespaceSchemaLocation = "AMZN-envelope.xsd" 'không phải là một tuyên bố không gian tên. Bạn sẽ phải thêm thuộc tính 'noNamespaceShcemaLocation' trong không gian tên' xsi' vào phần tử 'AmazonEnvelope', nhưng tôi không thể thực sự thấy một cách đơn giản để làm điều đó trong tài liệu trừ khi bạn có quyền truy cập vào nguồn của' XMLAmazonEnvelope '. Trong trường hợp đó, bạn có thể thêm một trường/thuộc tính vào lớp đó được chú thích bằng '[XmlAttribute]' với tên 'noNamespaceSchemaLocation' và giá trị bạn muốn. – millimoose

+0

Hoặc có thể truy cập vào nguồn bằng cách sử dụng 'XmlAttributeOverrides', nhưng tôi không biết chính xác cách thức hoạt động của API đó. – millimoose

+0

XmlAttribute chỉ cho phép các trường, thuộc tính, chỉ mục và tôi có: – user1359657

Trả lời