XML Serialization - ปิดใช้งานการแสดงผลองค์ประกอบรูทของอาร์เรย์


119

ฉันสามารถปิดการแสดงผลองค์ประกอบรากของคอลเลกชันได้หรือไม่?

คลาสนี้มีแอตทริบิวต์การทำให้เป็นอนุกรม:

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

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

สร้าง XML นี้:

<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>

ฉันไม่ต้องการ<Variants>องค์ประกอบที่นี่ สิ่งที่ฉันต้องทำ?

นอกจากนี้ฉันไม่ต้องการเนมสเปซ xsi และ xsd ในองค์ประกอบรูท ...


คำตอบ:


184

ในการปิดใช้งานการแสดงผลองค์ประกอบรากของคอลเลกชันคุณต้องแทนที่แอตทริบิวต์[XmlArrayItem]ด้วย[XmlElement]ในรหัสของคุณ

สำหรับการลบเนมสเปซxsiและxsdเนมสเปซให้สร้างXmlSerializerNamespacesอินสแตนซ์ด้วยเนมสเปซว่างและส่งต่อเมื่อคุณต้องการทำให้ออบเจ็กต์เป็นอนุกรม

ดูตัวอย่างนี้:

[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

ฉันได้รับผลลัพธ์นี้:

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

โปรดทราบว่าคุณต้องแทนที่ด้วย[XmlArray]หากมี
DBC


1

ฉันไม่เชื่อว่าเป็นไปได้ที่จะลบองค์ประกอบนี้โดยใช้การทำให้เป็นอนุกรม xml เริ่มต้น (พร้อมแอตทริบิวต์) หากคุณสามารถทำได้การจัดลำดับShopItemชั้นเรียนของคุณจะส่งผลให้ xml ที่มีรูปแบบไม่ถูกต้อง (ไม่มีองค์ประกอบรูท) สำหรับวัตถุซึ่งไม่ได้รับอนุญาต

คุณสามารถทำอะไร IXmlSerializableแต่เป็นด้วยตนเองใช้ สิ่งนี้จะให้การควบคุมที่ละเอียดอ่อนแก่คุณในภายหลัง

[ แก้ไข ] - ขออภัย - อ่านผิดที่คุณพยายามลบรูปแบบไม่ใช่ SHOPITEM หากต้องการลบรายการ "องค์ประกอบภายนอก" เพียงมาร์กอัปด้วยแอตทริบิวต์ [XmlElement] แทนที่จะเป็นแอตทริบิวต์ [XmlArrayItem] สิ่งนี้จะทำให้รายการใช้เพียงชื่อองค์ประกอบที่ระบุโดยไม่รวมรายการไว้ในองค์ประกอบภายนอก

สำหรับการลบเนมสเปซสิ่งนี้จะถูกควบคุมโดย seriliazer เองไม่ใช่มาร์กอัปบนคลาส ฉันเพิ่งสังเกตว่าในขณะที่ฉันอัปเดตคำตอบนี้ Rubens Farias ได้ให้คำตอบที่แสดงวิธีกำจัดเนมสเปซ


อ๊ะ - อ่านโพสต์ของคุณผิด - คิดว่าคุณกำลังพยายามลบ SHOPITEM - เพียงแค่แก้ไขคำตอบ!
Rob Levine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.