Question: I need to parse an XML file.

The structure of the file is below:

```
<root> 
      <group id = "one">
             <info1>
                   <detail1> detail </detail1>
                   <detail2> detail </detail2>
             </info1>
             <info2>
                   <detail1> detail </detail1>
                   <detail2> detail </detail2>
             </info2>
      </group> 
      <group id = "two">
             <info1>
                   <detail1> detail </detail1>
                   <detail2> detail </detail2>
             </info1>
             <info2>
                   <detail1> detail </detail1>
                   <detail2> detail </detail2>
             </info2>
      </group> 

</root>

```

I would like to store everything within the group element as a string. One string for everything in group regardless of the attribute id. How would I do that with XMLReader?

Answer: 
you have options to load class by using serialization, or dataset from XMLReader:
class:

```
[Serializable]
[XmlRoot(ElementName="root")]
public class root
{
    [System.Xml.Serialization.XmlElementAttribute("group")]
    public List<Group> group { get; set; }
}

[Serializable()]
public class Group
{
    [System.Xml.Serialization.XmlAttributeAttribute("id")]
    public string id { get; set; }

    public Info info1 { get; set; }
    public Info info2 { get; set; }
}

[Serializable()]
public class Info
{
    [XmlElement]
    public string detail1 { get; set; }
    [XmlElement]
    public string detail2 { get; set; }
}

```

and examlpes:

```
string xml = "<root><group id=\"one\"><info1><detail1>detail</detail1><detail2>detail</detail2></info1><info2><detail1>detail</detail1><detail2>detail</detail2></info2></group><group id=\"two\"><info1><detail1>detail</detail1><detail2>detail</detail2></info1><info2><detail1>detail</detail1><detail2>detail</detail2></info2></group></root>";
    XDocument x = XDocument.Parse(xml, LoadOptions.PreserveWhitespace);

    //option1
    XmlReader reader = x.CreateReader();
    DataSet ds = new DataSet();
    //DataSet will contain multiple tables
    ds.ReadXml(reader);

    //option 2
    XmlSerializer ser = new XmlSerializer(typeof(root));
    XmlReader reader2 = x.CreateReader();
    var res = ser.Deserialize(reader2);

```

as result you should have in option 1 DataSet with multiple tables, in option 2: loaded cobject "root":
[![result image](https://i.stack.imgur.com/nZtUo.png)](https://i.stack.imgur.com/nZtUo.png)
With XML Reader you can apply

```
List <string> stringList = new List <string>();

while (xmlReader.Read()) {
 if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "group")) {

  string str = string.Empty;
  foreach(var element in xmlReader) {
   str += element.value;

  }
  stringList.add(str);

 }
}

```

**Or**
You can create a class and do the mapping with properties

```
class Group {

 public string info1 {
  get;
  set;
 }

 public string info2 {
  get;
  set;
 }

 public string details1 {
  get;
  set;
 }

 public string details2 {
  get;
  set;
 }
}

List<Group> groupList = new List <Group>();

while (xmlReader.Read()) {
    if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "group")) {

     Group group = new Group();

     foreach(XmlNode node in xmlReader) {
      switch (node.Name) {
       case "info1":
        group.info1 = node.Value;
        break;
       case "info2":
        group.info2 = node.Value;
        break;
       case "details1":
        group.details1 = node.Value;
        break;
       case "details2":
        group.details2 = node.Value;
        break;        
      }
      groupList.add(group);
     }
}

```