13

Tôi đang sử dụng DatacontractSerializer để tuần tự hóa miền của tôiModel thành tệp xml. Tôi nhận được kết quả như dưới đây.Xóa tiền tố không gian tên "d1p1" trong đầu ra XML DataContractSerializer

<z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:d1p1="DCSerialization_IGITApproach" i:type="d1p1:X" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
    <d1p1:Name z:Id="2">Ankit</d1p1:Name> 
    <d1p1:PointsDictionary xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" z:Id="3" z:Size="1"> 
    <d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
     <d2p1:Key z:Id="4">key1</d2p1:Key> 
     <d2p1:Value xmlns:d4p1="http://schemas.datacontract.org/2004/07/SerializationApproach" z:Id="5"> 
     <d4p1:points z:Id="6" z:Size="2"> 
      <d2p1:double>45.5</d2p1:double> 
      <d2p1:double>546.45</d2p1:double> 
     </d4p1:points> 
     </d2p1:Value> 
    </d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
    </d1p1:PointsDictionary> 
</z:anyType> 

Và tôi muốn thoát khỏi những "d1p1" tiền tố vùng tên và chỉ muốn </PointDictionary> như thẻ thay vì </d1p1:PointsDictionary>. Tôi đã thử đặt thuộc tính DataMember có thuộc tính lớp của tôi nhưng nó không giải quyết được nhiều vấn đề. Vì tệp XML đầu ra có thể được người dùng cuối chỉnh sửa nên tôi muốn một tệp XML trông sạch hơn so với tệp ở trên.

Ưu tiên hàng đầu là chỉ kiểm soát mã thông qua mã và nếu không thì có thể truy cập XSLT hoặc bất kỳ lược đồ nào khác.

+0

Chào mừng bạn đến với StackOverflow: nếu bạn đăng mã, XML hoặc mẫu dữ liệu, hãy ** tô sáng những dòng đó trong trình soạn thảo và nhấp vào nút "mẫu mã" ('{}') trên thanh công cụ của trình chỉnh sửa định dạng và cú pháp làm nổi bật nó! –

Trả lời

3

Dường như DataContractSerializer không cung cấp quyền kiểm soát nhiều tiền tố. Câu trả lời cho XML Serialization and namespace prefixes đề xuất sử dụng XmlSerializer nếu bạn muốn kiểm soát tiền tố không gian tên.

Câu hỏi của bạn không rõ liệu bạn có muốn xóa hoàn toàn tiền tố không gian tên cho mẫu miền của mình hay không. Mẫu của bạn ở trên có một số tiền tố không gian tên: d1p1, d2p1, d4p1. Changing namespace for XML file in XSL Translation cung cấp một số hướng dẫn về đổi tên tiền tố bằng XSLT.

+5

XmlSerializer bị hai hạn chế so với DataContractSerializer: nó sẽ không xử lý các giao diện, và nó buộc tất cả các lớp phải có một hàm tạo parameterless. Tôi tin rằng nó là một giải pháp lâu dài tốt hơn để sử dụng DataContractSerializer và tìm một số phương pháp khác để đối phó với vấn đề không gian tên. – Contango

+0

@Contango, tôi đồng ý về nguyên tắc ... ngoại trừ 'DataContractSerializer' * nào * (theo kinh nghiệm của tôi) yêu cầu một hàm tạo parameterless. Tôi nhận được một lỗi thời gian chạy nếu tôi cố gắng để nhanh chóng nó trên một loại mà không có một. – harpo

+0

@harpo DataContractSerializer chắc chắn không yêu cầu một hàm tạo rỗng. Bạn đang làm điều gì đó không chính xác. Nếu bạn muốn đăng mã của mình trong một câu hỏi mới, tôi rất sẵn lòng xem xét mã đó. – Dan

5

Sử dụng vùng tên trống dường như xóa tiền tố. Thiết lập lớp học của bạn với các thuộc tính sau DataContract:

[DataContract(Namespace="")] 
public class MyClass 
{ ... } 

Sau đó, hãy chắc chắn để thiết lập các không gian tên cho một chuỗi rỗng khi (de) serializing:

DataContractSerializer deserializer = new DataContractSerializer(typeof(MyClass), typeof(MyClass).Name, ""); 
0

Bạn sẽ có thể để thoát khỏi những tiền tố bằng cách đảm bảo rằng các lớp mà bạn đang cố gắng tuần tự hóa thành XML nằm trong cùng một không gian tên. Ví dụ tôi có hai lớp ApplicationListResponse và Application. Trước đây, các không gian tên là Models.Responses và Models.Responses.Application. Tôi đã thay đổi cả hai Không gian tên thành "Mô hình" và đã loại bỏ tiền tố trong đầu ra XML.

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