Chuỗi tuần tự hóa XML - Tắt hiển thị phần tử gốc của mảng


119

Bằng cách nào đó, tôi có thể tắt hiển thị phần tử gốc của bộ sưu tập không?

Lớp này với các thuộc tính tuần tự hóa:

[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 không gian tên xsi và xsd trong phần tử gốc ...


Câu trả lời:


184

Để 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 không gian tên xsixsd, hãy tạo một XmlSerializerNamespacesthể hiện có không gian tên trống và chuyển nó khi bạn cần tuần tự hóa đối tượng của mình.

Hãy xem 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 nhận được kết quả 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>

Lưu ý bạn cũng phải thay thế [XmlArray]nếu có.
dbc


1

Tôi không tin rằng có thể xóa phần tử này bằng cách sử dụng tuần tự hóa xml mặc định (có thuộc tính). Nếu bạn có thể làm điều này, thì việc tuần tự hóa ShopItemlớp của bạn sẽ dẫn đến xml được định dạng xấu (không có phần tử gốc) cho đối tượng, điều này không được phép.

Tuy nhiên, những gì bạn có thể làm là 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 đang theo đuổi.

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

Đối với việc xóa không gian tên, điều này được kiểm soát bởi chính seriliazer, không phải đánh dấu trên lớp. Tôi vừa 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 một câu trả lời chỉ cho bạn cách loại bỏ không gian tên.


rất tiếc - đọc nhầm bài đăng của bạn - nghĩ rằng bạn đang cố xóa SHOPITEM - chỉ cần chỉnh sửa câu trả lời!
Rob Levine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.