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();
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();