c#xml:从文件中获取所有属性,但是添加了其他元素

时间:2013-09-03 10:28:18

标签: c# xml xmlreader

我需要从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();

2 个答案:

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