我需要从xml文件中获取带有一些参数的所有属性。 示例xml文件:
<?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>
我需要知道modeN和ClassTypeN的所有属性。 我这样做是通过使用代码:
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;
}
但是我有问题 - 当我运行这个函数时:getXMLValues(ConfigPath,“mode3”,“ClassType1”);我从mode1和mode2获得了一些其他元素,它们也有ClassType1。 那么,你能帮我解决这个错误吗?
更新: 我尝试写一些像这样的代码:
var elements=(from elems in document.Elements(classElement)
select elems.Attributes("i dont know what parameter i should use").ToList()
);
更新:我的团队帮我提供了这样的代码:
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();
答案 0 :(得分:1)
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();
答案 1 :(得分:0)
更新:我的团队帮我提供了这样的代码:
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();