2010-01-05 27 views
96

Tôi có thể vô hiệu hóa việc hiển thị phần tử gốc của bộ sưu tập không?Nối tiếp XML - Vô hiệu hóa hiển thị phần tử gốc của mảng

Lớp này với serialization thuộc tính:

[XmlRoot(ElementName="SHOPITEM", Namespace="")] 
public class ShopItem 
{ 
    [XmlElement("PRODUCTNAME")] 
    public string ProductName { get; set; }  

    [XmlArrayItem("VARIANT")] 
    public List<ShopItem> Variants { get; set; } 
} 

tạo XML này:

<SHOPITEM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <PRODUCTNAME>test</PRODUCTNAME> 
     <Variants> 
      <VARIANT> 
       <PRODUCTNAME>hi 1</PRODUCTNAME> 
      </VARIANT> 
      <VARIANT> 
       <PRODUCTNAME>hi 2</PRODUCTNAME> 
      </VARIANT>   
     </Variants>   
</SHOPITEM> 

Tôi không muốn <Variants> yếu tố ở đây. Tôi phải làm gì?

Ngoài ra tôi không cần xsi và xsd không gian tên trong phần tử gốc ...

Trả lời

151

Để tắt hiển thị phần tử gốc của bộ sưu tập, bạn phải thay thế thuộc tính [XmlArrayItem] bằng [XmlElement] trong mã của mình.

Để xóa các không gian tên xsixsd, hãy tạo một cá thể XmlSerializerNamespaces với vùng tên trống và chuyển nó khi bạn cần sắp xếp từng đối tượng của mình.

Hãy nhìn vào ví dụ này:

[XmlRoot("SHOPITEM")] 
public class ShopItem 
{ 
    [XmlElement("PRODUCTNAME")] 
    public string ProductName { get; set; } 

    [XmlElement("VARIANT")] // was [XmlArrayItem] 
    public List<ShopItem> Variants { get; set; } 
} 

// ... 

ShopItem item = new ShopItem() 
{ 
    ProductName = "test", 
    Variants = new List<ShopItem>() 
    { 
     new ShopItem{ ProductName = "hi 1" }, 
     new ShopItem{ ProductName = "hi 2" } 
    } 
}; 

// This will remove the xsi/xsd namespaces from serialization 
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("", ""); 

XmlSerializer ser = new XmlSerializer(typeof(ShopItem)); 
ser.Serialize(Console.Out, item, ns); // Inform the XmlSerializerNamespaces here 

tôi có đầu ra này:

<?xml version="1.0" encoding="ibm850"?> 
<SHOPITEM> 
    <PRODUCTNAME>test</PRODUCTNAME> 
    <VARIANT> 
    <PRODUCTNAME>hi 1</PRODUCTNAME> 
    </VARIANT> 
    <VARIANT> 
    <PRODUCTNAME>hi 2</PRODUCTNAME> 
    </VARIANT> 
</SHOPITEM> 
+0

Câu trả lời hay ... – camainc

1

Tôi không tin người ta có thể loại bỏ yếu tố này bằng cách sử dụng serialization xml mặc định (với các thuộc tính). Nếu bạn có thể làm điều này, sau đó tuần tự hóa lớp ShopItem của bạn sẽ dẫn đến xml không thành phần (không có phần tử gốc) cho đối tượng, điều này không được phép.

Tuy nhiên, bạn có thể thực hiện thủ công IXmlSerializable. Điều này sẽ cung cấp cho bạn loại kiểm soát chi tiết mà bạn có thể làm lại.

[Chỉnh sửa] - xin lỗi - đã đọc sai rằng bạn đang cố gắng xóa Biến thể, chứ không phải SHOPITEM. Để loại bỏ phần tử "bên ngoài" Danh sách, chỉ cần đánh dấu nó bằng thuộc tính [XmlElement] chứ không phải thuộc tính [XmlArrayItem]. Điều này sẽ gây ra các mục danh sách để chỉ sử dụng tên phần tử đã chỉ định, mà không bao gồm danh sách trong phần tử bên ngoài.

Để xóa các không gian tên, điều này được kiểm soát bởi chính seriliazer chứ không phải đánh dấu trên lớp. Tôi vừa mới nhận thấy rằng trong khi tôi đã cập nhật câu trả lời này, Rubens Farias đã cung cấp câu trả lời cho bạn biết cách loại bỏ không gian tên.

+0

oops - đọc sai bài đăng của bạn - nghĩ rằng bạn đang cố gắng xóa SHOPITEM - chỉ cần chỉnh sửa câu trả lời! –

28

Thay [XmlArrayItem("VARIANT")] với [XmlElement("VARIANT")].

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