Reputation: 55
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
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