1

1.Xml file contains xml elements: "INSTITUTION" and "institution" and each xml element contains attributes like name,code and INN.

My code works fine if xml element name is:"INSTITUTION" and fails when it reaches to xml element name:"institution".

I found some solutions from stackoverflow but it didn't help me...

How can I ignore case sensitivity for xml deserialization?

<institutions>
<INSTITUTION name= "some_value" CODE="some_value" INN="some_value"/>
<INSTITUTION name= "some_value" CODE="some_value" INN="some_value"/>
<INSTITUTION name= "some_value" CODE="some_value" INN="some_value"/>
<institution name= "some_value" code="some_value" inn="some_value"/>
<institution name= "some_value" code="some_value" inn="some_value"/>
<institution name= "some_value" code="some_value" inn="some_value"/>
<institution name= "some_value" code="some_value" inn="some_value"/>
</institutions>
</treasury>

C# Code:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using Test_for_finding_file_type.XmlSynonymDeserializer;
//This is the class that will be deserialized
[XmlRoot("treasury")]
public class Treasury
{
    [XmlElement("institutions")]
    public institutions Institutions { get; set; }
}

public class institutions
{
    [XmlElement("INSTITUTION")]
    public List<Institution> InstitutionList { get; set; }
}
public class Institution
{
    [XmlAttribute("name")]
    public string Name;
    [XmlAttribute("CODE")]
    public string Code;
    [XmlAttribute("INN")]
    public string Inn;
}


public class Program
{
    public static void Main(String[] args)
    {
        Program pro = new Program();
        pro.DeserializeObject("test.xml");
    }
    private void DeserializeObject(string filename)
    {
        Console.WriteLine("Reading with XML Reader");

        XmlSerializer serializer = new XmlSerializer(typeof(Treasury));


        FileStream fs = new FileStream(filename, FileMode.Open);
        XmlReader reader = XmlReader.Create(fs);


        Treasury treasuryAccounts;
        treasuryAccounts = (Treasury)serializer.Deserialize(reader);

        fs.Close();

        Console.WriteLine("\n------------------------------------------Institutions---------------------------------------------------------\n");
        foreach (var institition in treasuryAccounts.Institutions.InstitutionList)
        {
            Console.Write("Treasury Account Name:" + institition.Name
                  + "\tCODE:" + institition.Code
                  + "\tINN:" + institition.Inn
                  + "\n\n"
          );
        }

        Console.ReadKey();
    }
}
  • Can you use `ToLower()` (or `ToUpper()`) somehow for the XmlElement you need? That way the elements could be case insensitive. – Faenrig Oct 29 '19 at 07:52
  • I add additional code but I think it only reads elements from xml file. What can I do for the next step? if (reader.NodeType == XmlNodeType.Element) if (reader.Name == "institution")... reader.Name.Replace(reader.Name, reader.Name.ToUpper()); – Cemil Rehimov Oct 29 '19 at 08:26
  • For some options see [Case insensitive XML parser in c#](https://stackoverflow.com/q/9334771/3744182), [Deserialize/Read xml when casing of elements is inconsistent.](https://stackoverflow.com/q/45776598/3744182), – dbc Oct 29 '19 at 16:48

1 Answers1

0

The whole issue is the missing XmlRoot attribute. See code below :

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

[XmlRoot("treasury")]
public class Treasury
{
    [XmlElement("institutions")]
    public Institutions institutions { get; set; }
}
[XmlRoot("institutions")]
public class Institutions
{
    [XmlElement("INSTITUTION")]
    public List<Institution> InstitutionList { get; set; }
}
public class Institution
{
    [XmlAttribute("name")]
    public string Name;
    [XmlAttribute("CODE")]
    public string Code;
    [XmlAttribute("INN")]
    public string Inn;
}


public class Program
{
    const string FILENAME = @"c:\temp\test.xml";
    public static void Main(String[] args)
    {
        Program pro = new Program();
        pro.DeserializeObject(FILENAME);
    }
    private void DeserializeObject(string filename)
    {
        Console.WriteLine("Reading with XML Reader");

        XmlSerializer serializer = new XmlSerializer(typeof(Institutions));

        XmlReader reader = XmlReader.Create(FILENAME);


        Treasury treasuryAccounts = new Treasury();

        treasuryAccounts.institutions = (Institutions)serializer.Deserialize(reader);

        reader.Close();

        Console.WriteLine("\n------------------------------------------Institutions---------------------------------------------------------\n");
        foreach (var institition in treasuryAccounts.institutions.InstitutionList)
        {
            Console.Write("Treasury Account Name:" + institition.Name
                  + "\tCODE:" + institition.Code
                  + "\tINN:" + institition.Inn
                  + "\n\n"
          );
        }

        Console.ReadKey();
    }
}
jdweng
  • 33,250
  • 2
  • 15
  • 20