This is my 3 sample xml files:
<?xml version = '1.0' encoding = 'UTF-8'?>
<ABC>
<Header>
<Date>2020-03-20T09:08:29Z</Date>
<Code>A101</Code>
</Header>
<Document>
<AAA>Test Data 123</AAA>
<BBB>Test Date 456</BBB>
</Document>
</ABC>
<?xml version = '1.0' encoding = 'UTF-8'?>
<ABC>
<Header>
<Date>2020-03-20T09:08:29Z</Date>
<Code>A106</Code>
</Header>
<Document>
<MMM>Test Data 123</MMM>
<ZZZ>Test Data 456</ZZZ>
<CCC>Test Data 888</CCC>
</Document>
</ABC>
<?xml version = '1.0' encoding = 'UTF-8'?>
<ABC>
<Header>
<Date>2020-03-20T09:08:29Z</Date>
<Code>A100</Code>
</Header>
<Document>
<QQQ>Test Data 999</QQQ>
<LLL>Test Data 000</LLL>
</Document>
</ABC>
Notice that the Header
schema is the same but the schema inside Document
tag are different based on the Code
tag
And here are my classes. Since the Header
is the same, I move the Header
to another class.
namespace Model.A100
{
[XmlRoot(ElementName = "Document")]
public class Document
{
[XmlElement(ElementName = "QQQ")]
public string QQQ { get; set; }
[XmlElement(ElementName = "LLL")]
public string LLL { get; set; }
}
[XmlRoot(ElementName = "ABC")]
public class ABC
{
[XmlElement(ElementName = "Header")]
public Header Header { get; set; }
[XmlElement(ElementName = "Document")]
public Document Document { get; set; }
}
}
namespace Model.A101
{
[XmlRoot(ElementName = "Document")]
public class Document
{
[XmlElement(ElementName = "AAA")]
public string AAA { get; set; }
[XmlElement(ElementName = "BBB")]
public string BBB { get; set; }
}
[XmlRoot(ElementName = "ABC")]
public class ABC
{
[XmlElement(ElementName = "Header")]
public Header Header { get; set; }
[XmlElement(ElementName = "Document")]
public Document Document { get; set; }
}
}
namespace Model.A106
{
[XmlRoot(ElementName = "Document")]
public class Document
{
[XmlElement(ElementName = "MMM")]
public string MMM { get; set; }
[XmlElement(ElementName = "ZZZ")]
public string ZZZ { get; set; }
[XmlElement(ElementName = "CCC")]
public string CCC { get; set; }
}
[XmlRoot(ElementName = "ABC")]
public class ABC
{
[XmlElement(ElementName = "Header")]
public Header Header { get; set; }
[XmlElement(ElementName = "Document")]
public Document Document { get; set; }
}
}
namespace Model
{
[XmlRoot(ElementName = "Header")]
public class Header
{
[XmlElement(ElementName = "Date")]
public string Date { get; set; }
[XmlElement(ElementName = "Code")]
public string Code { get; set; }
}
}
To deserialize to Xml to C# object,
var serializer = new XmlSerializer(typeof(Model.Header));
using (TextReader reader = new StreamReader(new FileStream(filePath, FileMode.Open)))
{
var obj = (Model.Header)serializer.Deserialize(reader);
// do something
}
Now that I can extract out the Header
, how do I do the same for the Document
tag which is based on Code
tag? Surely, I can't be writing if statement
or switch case
.