2010-02-26 38 views
49

Tôi đang tìm một cách với C# mà tôi có thể tuần tự hóa một lớp thành XML và thêm một không gian tên, nhưng xác định tiền tố mà không gian tên đó sẽ sử dụng.Tiền tố tuần tự hóa và không gian tên XML

Cuối cùng, tôi đang cố gắng để tạo ra XML sau:

<myNamespace:Node xmlns:myNamespace="..."> 
    <childNode>something in here</childNode> 
</myNamespace:Node> 

Tôi biết với cả DataContractSerializerXmlSerializer tôi có thể thêm một không gian tên, nhưng họ dường như để tạo ra một tiền tố nội bộ, với một cái gì đó mà tôi 'không thể kiểm soát được. Tôi có thể kiểm soát nó với một trong những serializers (tôi có thể sử dụng một trong số họ)?

Nếu tôi không thể kiểm soát việc tạo ra các không gian tên, tôi sẽ cần phải viết trình tự tuần tự hóa XML của riêng mình, và nếu có, thì cách tốt nhất để viết nó là gì?

Trả lời

84

Để kiểm soát bí danh không gian tên, hãy sử dụng XmlSerializerNamespaces.

[XmlRoot("Node", Namespace="http://flibble")] 
public class MyType { 
    [XmlElement("childNode")] 
    public string Value { get; set; } 
} 

static class Program 
{ 
    static void Main() 
    { 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("myNamespace", "http://flibble"); 
     XmlSerializer xser = new XmlSerializer(typeof(MyType)); 
     xser.Serialize(Console.Out, new MyType(), ns); 
    } 
} 

Nếu bạn cần phải thay đổi namespace khi chạy, bạn có thể sử dụng thêm XmlAttributeOverrides.

+4

+1 nhưng tôi có thể đề xuất chỉnh sửa để làm rõ rằng tham số đầu tiên trong phương thức .Add là nơi phép thuật xảy ra để đặt tiền tố. Nó không rõ ràng với tôi từ câu trả lời cho đến khi tôi kiểm tra các tài liệu MSDN. –

+0

công bằng để giả định rằng không có tương đương với DataContractSerializer? (Chỉ muốn giữ cho các tùy chọn của tôi mở) –

+0

@Slace - vâng, tôi tin rằng nó là an toàn để giả định rằng có ** không phải là ** tương đương với DCS. Cuối cùng, DCS không có ý định cung cấp cho bạn nhiều quyền kiểm soát đầu ra (nếu bạn muốn kiểm soát xml, hãy sử dụng 'XmlSerializer' - đó là công việc của nó). –

3

Khi sử dụng mã được tạo từ một lược đồ trong đó các loại có không gian tên, ghi đè vùng tên này áp dụng ở cấp cơ sở nhưng các thẻ trong các loại khác nhau sẽ có không gian tên được liên kết với lớp đó.

Tôi đã có dịp cần sử dụng hai lớp được tạo khác nhau nhưng có các không gian tên khác nhau dựa trên máy chủ mà tôi đang nói đến (không hỏi không dưới sự kiểm soát của tôi).

Tôi đã thử tất cả các ghi đè được cung cấp ở đây và cuối cùng đã từ bỏ và sử dụng một loại phương pháp bạo lực thực sự hoạt động khá tốt. Những gì tôi đã làm là serialize thành một chuỗi. Sau đó, sử dụng string.replace để thay đổi các không gian tên sau đó đăng luồng từ chuỗi bằng cách sử dụng một chuỗi ký tự. Tương tự trên phản ứng - nắm bắt một chuỗi - thao tác các không gian tên sau đó deserialize chuỗi từ một nhà văn chuỗi.

Nó có thể không được thanh lịch hoặc sử dụng tất cả các ghi đè ưa thích nhưng nó đã hoàn thành công việc.

Các vấn đề liên quan