Jak zserializować zagnieżdżone obiekty do XML?

Jak zserializować zagnieżdżone obiekty do XML?
P2
  • Rejestracja:prawie 4 lata
  • Ostatnio:ponad rok
  • Postów:148
0

Witam,
Na pisałem kod klasy jak niżej:

Kopiuj
using System;
using System.Xml.Serialization;

namespace Test1
{
    [Serializable]
    [XmlRoot("Dokument")]
    public class Dokument
    {
        
        [XmlElement("NaglowekDokumentu")]
        public static string Wariant { get; set; }        
        public static DateTime DataUtworzenia { get; set; }
        
        [XmlElement("Firma")]
        //????????????????????????????????????????  
    }
}

Nie wiem jak zabrać się za element "Firma", aby struktura XML dla tego elementu wyglądała jak niżej. Pomoże ktoś ?

Kod XML jak ma wyglądać struktura elementu "Firma":

Kopiuj
<Firma>
		<Dane>
			<NIP>1111111111</NIP>
			<Nazwa>Test</Nazwa>
		</Dane>
		<Adres>
			<Kraj>PL</Kraj>
			<Adres1>ul. Testowa 1</Adres1>
			<Adres2>00-000 Testy</Adres2>
		</Adres>
		<Kontakt>
			<Email>test@test.pl</Email>
			<Telefon>111-111-111</Telefon>
		</Kontakt>
</Firma>
edytowany 2x, ostatnio: Riddle
jarzi
  • Rejestracja:prawie 10 lat
  • Ostatnio:17 dni
  • Postów:96
1
Kopiuj
    [XmlRoot(ElementName="Dane")]
	public class Dane
    {
		[XmlElement(ElementName="NIP")]
		public string NIP { get; set; }
		[XmlElement(ElementName="Nazwa")]
		public string Nazwa { get; set; }
	}

	[XmlRoot(ElementName="Adres")]
	public class Adres
    {
		[XmlElement(ElementName="Kraj")]
		public string Kraj { get; set; }
		[XmlElement(ElementName="Adres1")]
		public string Adres1 { get; set; }
		[XmlElement(ElementName="Adres2")]
		public string Adres2 { get; set; }
	}

	[XmlRoot(ElementName="Kontakt")]
	public class Kontakt
    {
		[XmlElement(ElementName="Email")]
		public string Email { get; set; }
		[XmlElement(ElementName="Telefon")]
		public string Telefon { get; set; }
	}

	[XmlRoot(ElementName="Firma")]
	public class Firma
    {
		[XmlElement(ElementName="Dane")]
		public Dane Dane { get; set; }
		[XmlElement(ElementName="Adres")]
		public Adres Adres { get; set; }
		[XmlElement(ElementName="Kontakt")]
		public Kontakt Kontakt { get; set; }
	}

Loading...
P2
Super, wielkie dzięki
P2
  • Rejestracja:prawie 4 lata
  • Ostatnio:ponad rok
  • Postów:148
0

teraz robię serializację tego do XML i zapis w pliku, nasuwa się pytanie jak można dynamicznie obsłużyć budowanie XML, żeby np. element "Adres" był dodawany do pliku XML, a innym razem nie ? Zauważyłem że jak mam elementy typy DECIMAL to, jak nie chcę ich mieć w XML to i tak wstawia 0. Poniżej kod jak robię serializację:

Kopiuj
private static void SerializeObjectToXml()
{ 
  Dokument dokument = new Dokument
  {
      Dane = new Dane
      {          
          NIP = "1111111111",
          Nazwa = "Test",          
      },
  }

  XmlSerializer serializer = new XmlSerializer(typeof(Dokument));
  using (TextWriter writer = new StreamWriter("test.xml"))
  {
      serializer.Serialize(writer, dokument);
  }
}
edytowany 2x, ostatnio: pawelus222
P2
  • Rejestracja:prawie 4 lata
  • Ostatnio:ponad rok
  • Postów:148
0

Teraz jak dodam do klasy z modelem element "Kwota":

Kopiuj
[XmlRoot(ElementName="Dane")]
	public class Dane
    {
		[XmlElement(ElementName="NIP")]
		public string NIP { get; set; }
		[XmlElement(ElementName="Nazwa")]
		public string Nazwa { get; set; }
        [XmlElement(ElementName="Kwota")]
        public decimal Kwota {get; set;}
	}

jeśli go nie uwzględnię w metodzie SerializeObjectToXml() to w pliku XML dodaje się:

Kopiuj
<Kwota>0</Kwota>

Jest jakiś sposób, aby w takim przypadku do pliku XML nie była dodawana Kwota ???

edytowany 2x, ostatnio: pawelus222
AD
  • Rejestracja:ponad rok
  • Ostatnio:13 dni
  • Postów:50
0

Zobacz czy zadziała jak dodasz do klasy "Dane" metodę ShouldSerialize<PropertyName>.
Przykładowo:

Kopiuj
  public bool ShouldSerializeKwota()
  {
      return Kwota is not 0;
  }

Chociaż w takim wypadku ja bym zamienił decimal na decimal? żeby dopuścić nulla i uniknąć sytuacji kiedy wartość 0 jest faktycznie podaną kwotą, natomiast nie zapisywać kiedy jest nullem, czyli:

Kopiuj
  public bool ShouldSerializeKwota()
  {
      return Kwota is not null;
  }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.