Search code examples
c#xmlxmlreader

c# xml:get all atributes from file,but have add additional elements


I need to get all attributes from xml file with some parameters. Example xml file:

<?xml version="1.0" encoding="utf-8"?>
<Model Name="modelname">
    <Mode Name="mode1">
        <ClassType1>class1</ClassType1>
        <ClassType2>class2</ClassType2>
        <ClassType3>class3</ClassType3>
            </Mode>
            <Mode Name="mode2">
                    <ClassType1>class4</ClassType1>
        <ClassType2>class5</ClassType2>
        <ClassType3>class6</ClassType3>
            </Mode>
            <Mode Name="mode3">
                    <ClassType1>class7</ClassType1>
        </Mode>
     </Model>

And i need to know all attributes with modeN and ClassTypeN. I do this by use code:

public static HashSet<String> getXMLValues(String configPath,String nameMode,String classElement)
    {

         XDocument document = XDocument.Load(configPath);
    var lmodes = (from modes in document.Root.Descendants("Mode")
          select modes.Attribute("Name").Value).ToList();
        bool elementExists = false;
        bool namemode = false;
        HashSet<String> values = new HashSet<string>();
        XmlTextReader reader = new XmlTextReader(configPath);
        while (reader.Read())
        {
            switch(reader.NodeType)
            {
                case XmlNodeType.Element: 

                    if (reader.Name == "Mode")
                    {
                        for (int i = 0; i < lmodes.Count; i++)
                        {
                            if (nameMode == lmodes[i])
                            {
                                namemode = true;   
                            }
                        }   
                    }          
                    if (namemode)
                    {
                        if (reader.Name == classElement) 
                        {
                            elementExists = true; 
                        }  
                    } 
                    break;
                case XmlNodeType.Text: 
                    if (namemode)
                    {
                        if (elementExists)
                        {
                            values.Add(reader.Value);
                            elementExists = false;
                        }
                    }
                    break;
            }
        }
        return values;

    }

But i have problem- when i run this function:getXMLValues(ConfigPath,"mode3", "ClassType1");i get some additional elements from mode1 and mode2 wich have ClassType1 too. So, can you help me to fix this mistake?

UPDATE: I try to write some code like this:

var elements=(from elems in document.Elements(classElement)
               select elems.Attributes("i dont know what parameter i should      use").ToList()
              );

UPDATE: my team help me with such code:

var elem = document.Root.Elements("Mode").
            Where(o => o.Attribute("Name") != null && o.Attribute("Name").Value == nameMode);
        var rr = elem.Elements(classElement).Select(o => o.Value).ToArray();

Solution

  • var modes = XDocument.Load(fname)
                .Descendants("Mode")
                .Select(m => new
                {
                    Name = m.Attribute("Name").Value,
                    ClassTypes = m.Elements().ToDictionary(e=>e.Name.LocalName,e=>e.Value)
                })
                .ToList();