2008-11-03 29 views

Trả lời

113

Ahh ... nevermind. Nó luôn luôn là tìm kiếm sau khi câu hỏi được đặt ra rằng mang lại câu trả lời. Đối tượng của tôi đang được tuần tự hóa là obj và đã được xác định. Thêm một XMLSerializerNamespace với một không gian tên trống duy nhất cho bộ sưu tập hiện các trick.

Trong VB như thế này:

Dim xs As New XmlSerializer(GetType(cEmploymentDetail)) 
Dim ns As New XmlSerializerNamespaces() 
ns.Add("", "") 

Dim settings As New XmlWriterSettings() 
settings.OmitXmlDeclaration = True 

Using ms As New MemoryStream(), _ 
    sw As XmlWriter = XmlWriter.Create(ms, settings), _ 
    sr As New StreamReader(ms) 
xs.Serialize(sw, obj, ns) 
ms.Position = 0 
Console.WriteLine(sr.ReadToEnd()) 
End Using 

trong C# như thế này:

//Create our own namespaces for the output 
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 

//Add an empty namespace and empty value 
ns.Add("", ""); 

//Create the serializer 
XmlSerializer slz = new XmlSerializer(someType); 

//Serialize the object with our own namespaces (notice the overload) 
slz.Serialize(myXmlTextWriter, someObject, ns); 
+8

Tôi đã thử tính năng này trong VB, thuộc tính xsi và xsd biến mất nhưng các thuộc tính như xmlns: q12 =, d3p1: type và xmlns: d3p1 xuất hiện. – MiddleKay

+9

Tôi đã thử phiên bản C# và đã xóa xsi và xsd nhưng thêm tiền tố q1: vào tất cả các tên thẻ XML mà tôi không muốn.Dường như ví dụ C# là không đầy đủ, tham chiếu myXmlTextWriter mà tôi cho rằng cần phải được khởi tạo giống như ví dụ VB. – redtetrahedron

+0

@redtetrahedron Bạn đã tìm ra cách để loại bỏ 'q1' crap? – crush

16

Nếu bạn muốn thoát khỏi thêm các xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema", nhưng vẫn giữ namespace của riêng bạn xmlns="http://schemas.YourCompany.com/YourSchema/", bạn sử dụng cùng mã như trên ngoại trừ thay đổi đơn giản này:

// Add lib namespace with empty prefix 
ns.Add("", "http://schemas.YourCompany.com/YourSchema/"); 
+3

Liên kết đó bị hỏng –

4

Nếu bạn không thể thoát khỏi xmlns thêm thuộc tính cho mỗi phần tử, khi serializing để xml từ các lớp được tạo ra (ví dụ: khi xsd.exe đã được sử dụng), vì vậy bạn có cái gì đó như:

<manyElementWith xmlns="urn:names:specification:schema:xsd:one" /> 

sau đó tôi sẽ chia sẻ với bạn những gì làm việc cho tôi (một hỗn hợp các câu trả lời trước đó và những gì tôi tìm thấy here)

thiết lập một cách rõ ràng tất cả xmlns khác nhau của bạn như sau:

Dim xmlns = New XmlSerializerNamespaces() 
xmlns.Add("one", "urn:names:specification:schema:xsd:one") 
xmlns.Add("two", "urn:names:specification:schema:xsd:two") 
xmlns.Add("three", "urn:names:specification:schema:xsd:three") 

sau đó vượt qua nó để serialize

serializer.Serialize(writer, object, xmlns); 

bạn sẽ có ba không gian tên được khai báo trong phần tử gốc và không có nhiều việc cần phải được tạo ra trong các yếu tố khác mà sẽ có tiền tố phù hợp

<root xmlns:one="urn:names:specification:schema:xsd:one" ... /> 
    <one:Element /> 
    <two:ElementFromAnotherNameSpace /> ... 
5

tôi Suggest lớp helper này:

public static class Xml 
{ 
    #region Fields 

    private static readonly XmlWriterSettings WriterSettings = new XmlWriterSettings {OmitXmlDeclaration = true, Indent = true}; 
    private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")}); 

    #endregion 

    #region Methods 

    public static string Serialize(object obj) 
    { 
     if (obj == null) 
     { 
      return null; 
     } 

     return DoSerialize(obj); 
    } 

    private static string DoSerialize(object obj) 
    { 
     using (var ms = new MemoryStream()) 
     using (var writer = XmlWriter.Create(ms, WriterSettings)) 
     { 
      var serializer = new XmlSerializer(obj.GetType()); 
      serializer.Serialize(writer, obj, Namespaces); 
      return Encoding.UTF8.GetString(ms.ToArray()); 
     } 
    } 

    public static T Deserialize<T>(string data) 
     where T : class 
    { 
     if (string.IsNullOrEmpty(data)) 
     { 
      return null; 
     } 

     return DoDeserialize<T>(data); 
    } 

    private static T DoDeserialize<T>(string data) where T : class 
    { 
     using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(data))) 
     { 
      var serializer = new XmlSerializer(typeof (T)); 
      return (T) serializer.Deserialize(ms); 
     } 
    } 

    #endregion 
} 

:)

+0

câu trả lời tuyệt vời :) tôi cũng đã thêm dòng này ** stream.Position = 0; ** và trả về toàn bộ luồng trong giải pháp của tôi .. hoạt động như mong đợi - tất cả các thẻ giảm tốc đã bị xóa – ymz

7

Nếu bạn muốn loại bỏ không gian tên, bạn cũng có thể muốn xóa phiên bản, để lưu bạn tìm kiếm tôi đã thêm chức năng đó để mã bên dưới sẽ thực hiện cả hai.

Tôi cũng đã bọc nó theo một phương pháp chung vì tôi đang tạo các tệp xml rất lớn, quá lớn để tuần tự hóa trong bộ nhớ, vì vậy tôi đã chia nhỏ tệp đầu ra của mình và sắp xếp nó thành các phần nhỏ hơn:

public static string XmlSerialize<T>(T entity) where T : class 
    { 
     // removes version 
     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.OmitXmlDeclaration = true; 

     XmlSerializer xsSubmit = new XmlSerializer(typeof(T)); 
     using (StringWriter sw = new StringWriter()) 
     using (XmlWriter writer = XmlWriter.Create(sw, settings)) 
     { 
      // removes namespace 
      var xmlns = new XmlSerializerNamespaces(); 
      xmlns.Add(string.Empty, string.Empty); 

      xsSubmit.Serialize(writer, entity, xmlns); 
      return sw.ToString(); // Your XML 
     } 
    } 
Các vấn đề liên quan