Jeremy
Jeremy

Reputation: 55

How to do multiple different classes to generate XML?

I was trying to do XML Serialization. Which have multiple different classes which is Header & Item. I create class TransferOrder to combine Header & Item. Header is doing well, but Item is showing twice.

Below here are my Program.cs

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.IO;
using System.Collections.Generic;

namespace XML_Serialization
{
    
    class Program
    {
       
        public static void Main(string[] args)
        {
            Program p = new Program();
            p.Final("item.xml");

        }

        public void Final(string filename)
        {
            XmlSerializer s = new XmlSerializer(typeof(TransferOrder));
            TextWriter writer = new StreamWriter(filename);
            TransferOrder c = new TransferOrder();

            Header head = new Header();
            head.DocNo = 0000000044;
            head.MoveType = 311;
            head.SourceStrType = 010;
            head.SourceStrBin = "IQA";
            head.DestStrType = 921;
            head.DestStrBin = "TRANSFER";
            head.Werks = 3006;

            c.Header = head;

            //Item Serialization 
            Item item1 = new Item();
            item1.MaterialNo = 000000000010001251;
            item1.Sloc = "KM22";
            item1.Quantity = 5.000;
            item1.UOM = "M2";
            item1.PlantID = 3006;
            item1.LineItem = 1;

            Item item2 = new Item();
            item2.MaterialNo = 000000000010001251;
            item2.Sloc = "KM22";
            item2.Quantity = 5.000;
            item2.UOM = "M2";
            item2.PlantID = 3006;
            item2.LineItem = 2;

            Item item3 = new Item();
            item3.MaterialNo = 000000000010001251;
            item3.Sloc = "KM22";
            item3.Quantity = 5.000;
            item3.UOM = "M2";
            item3.PlantID = 3006;
            item3.LineItem = 3;

            Item[] ig = { item1, item2, item3 };
            c.Item = ig;

            s.Serialize(writer, c);
            writer.Close();

        }

    }

    public class TransferOrder
    {
        public Header Header { get; set; }
        public Item []Item { get; set; }
    }

    public class Header
    {
        public int DocNo { get; set; }
        public int MoveType { get; set; }
        public int SourceStrType { get; set; }
        public string SourceStrBin { get; set; }
        public int DestStrType { get; set; }
        public string DestStrBin { get; set; }
        public int Werks { get; set; }

    }

    public class Item
    {
        public int MaterialNo { get; set; }
        public string Sloc { get; set; }
        public double Quantity { get; set; }
        public string UOM { get; set; }
        public int PlantID { get; set; }
        public int LineItem { get; set; }
}

The result I wanna get is like this

<?xml version="1.0" encoding="utf-8"?><dtl:TransferOrder xmlns:dtl="http://FS.BizTalk.App.RFID.CommonTODetail.Schemas.DetailTO/2021/03">
  <Header>
    <DocNo>0000000044</DocNo>
    <MoveType>311</MoveType>
    <SourceStrType>010</SourceStrType>
    <SourceStrBin>IQA</SourceStrBin>
    <DestStrType>921</DestStrType>
    <DestStrBin>TRANSFER</DestStrBin>
    <Werks>3006</Werks>
  </Header>
  <Item>
    <MaterialNo>000000000010001251</MaterialNo>
    <SLoc>KM22</SLoc>
    <Quantity>5.000</Quantity>
    <UOM>M2</UOM>
    <PlantId>3006</PlantId>
    <LineItem>1</LineItem>
  </Item>
  <Item>
    <MaterialNo>000000000010001251</MaterialNo>
    <SLoc>KM22</SLoc>
    <Quantity>5.000</Quantity>
    <UOM>M2</UOM>
    <PlantId>3006</PlantId>
    <LineItem>2</LineItem>
  </Item>
  <Item>
    <MaterialNo>000000000010001251</MaterialNo>
    <SLoc>KM22</SLoc>
    <Quantity>5.000</Quantity>
    <UOM>M2</UOM>
    <PlantId>3006</PlantId>
    <LineItem>3</LineItem>
  </Item>
</dtl:TransferOrder>

However, if you run my code, the output of my code have 2 Item Element . Which is different with the one I want.

Could anyone help me to solve this ?

Upvotes: 1

Views: 77

Answers (1)

Marc Gravell
Marc Gravell

Reputation: 1062780

Add [XmlElement]:

    public class TransferOrder
    {
        public Header Header { get; set; }
        [XmlElement]
        public Item []Item { get; set; }
    }

(the default behaviour is to add a wrapper layer on lists/arrays; [XmlElement] tells it to omit that and go direct to the child data)

Upvotes: 2

Related Questions