-3

我需要使用一些参数从 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();
4

2 回答 2

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();
于 2013-09-03T10:40:11.370 回答
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();
于 2013-09-03T12:22:38.550 回答