XML Serileştirme - Dizinin kök öğesini oluşturmayı devre dışı bırak


119

Koleksiyonun kök öğesinin oluşturulmasını bir şekilde devre dışı bırakabilir miyim?

Serileştirme özniteliklerine sahip bu sınıf:

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

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

şu XML'i oluşturur:

<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>Burada element istemiyorum . Ne yapmalıyım

Ayrıca kök öğede xsi ve xsd ad alanlarına ihtiyacım yok ...


Yanıtlar:


184

Koleksiyonun kök öğesinin oluşturulmasını devre dışı bırakmak için, kodunuzdaki özniteliği [XmlArrayItem]ile değiştirmelisiniz [XmlElement].

xsiVe xsdad alanlarını kaldırmak için , XmlSerializerNamespacesboş bir ad alanına sahip bir örnek oluşturun ve nesnenizi serileştirmeniz gerektiğinde bunu iletin.

Bu örneğe bir göz atın:

[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

Bu çıktıyı aldım:

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

[XmlArray]Varsa değiştirmeniz gerektiğini de unutmayın .
dbc


1

Varsayılan xml serileştirmeyi (özniteliklerle) kullanarak bu öğeyi kaldırmanın mümkün olduğuna inanmıyorum. Bunu yapabilirseniz, ShopItemsınıfınızı serileştirmek , nesne için kötü biçimlendirilmiş xml (kök öğesi yok) ile sonuçlanır, buna izin verilmez.

Ancak yapabileceğiniz şey manuel olarak uygulamaktır IXmlSerializable. Bu size, peşinde olduğunuz ince ayarlı kontrolü sağlayacaktır.

[ Düzenle ] - üzgünüm - SHOPITEM'i değil Varyantları kaldırmaya çalıştığınız yanlış okundu. List "dış" öğesini kaldırmak için, onu bir [XmlArrayItem] özniteliği yerine bir [XmlElement] özniteliğiyle işaretlemeniz yeterlidir. Bu, liste girişlerinin listeyi bir dış elemana sarmadan sadece belirtilen eleman adını kullanmasına neden olur.

İsim alanlarını kaldırmak için bu, sınıftaki işaretleme tarafından değil, seriliazer tarafından kontrol edilir. Bu cevabı güncellediğimde Rubens Farias'ın size ad alanını nasıl ortadan kaldıracağınızı gösteren bir cevap verdiğini fark ettim.


oops - gönderinizi yanlış okuyun - SHOPITEM'i kaldırmaya çalıştığınızı sandınız - sadece yanıtı düzenlediniz!
Rob Levine
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.