使用linq从xml文件中查找

时间:2012-11-09 13:49:11

标签: c# xml winforms linq

我想读取一个xml文件并加载为列表,并在表单加载期间查找该值。我怎样才能读取文件并将其作为列表? Xml文件:

<?xml version="1.0" encoding="utf-8"?>
<Types>
<Type>t1-p2</Type>
<Type>t1-k1</Type>
<Type>t2-s2</Type>
</Types>

班级档案:

class Testtypes
    {
        public string Type;

        public static List<Testtypes> getTypes()
        {
            XDocument doc = XDocument.Parse("test.xml");
            var q = doc.Descendants("Type").ToList();
            return getTypes.();
        }
    }

5 个答案:

答案 0 :(得分:4)

首先,我有公共字段。至少使用一个属性。我还将课程重命名为更有意义的课程。但您可以将代码更改为:

class Testtypes
{
    public string Type { get; private set; }

    public static List<Testtypes> FromXml(string filename)
    {
        return XDocument.Load(filename)
                        .Root.Elements("Type")
                        .Select(x => new Testtypes { Type = x.Value })
                        .ToList();
    }
}

或者假设你只有一个字符串,你可以避免创建自己的类型:

public static List<string> FromXml(string filename)
{
    return XDocument.Load(filename)
                    .Root.Elements("Type")
                    .Select(x => x.Value)
                    .ToList();
}

答案 1 :(得分:3)

Parse方法接收一个就绪字符串,您需要先读取该文件。 使用Load方法读取文件,它可以使用Descendants方法,如下所示:

public static IEnumerable<string> GetTypes()
{
    XDocument doc = XDocument.Load("../../test.xml");
    var xmlElementList = doc.Descendants("Type");
    var stringList = xmlElementList.Select(element => element.Value);

    return stringList;
}
祝你好运

答案 2 :(得分:1)

            private static List<TestType> testType;

            public static List<TestType> TestTypes
            {
                get
                {
                    if (testType== null)
                    {
                        var fileName = GetFilePath("TestTypes.xml");

                        testType= DeseriaizeXml<List<TestType>>(fileName);
                    }

                    return testType;
                }
            }



  private static T DeseriaizeXml<T>(String fileName) where T : class
            {
                using (var stream = File.OpenRead(fileName))
                {
                    return DeseriaizeXml<T>(stream);
                }
            }

            private static T DeseriaizeXml<T>(Stream stream) where T : class
            {
                using (
                    var xmlReader = XmlDictionaryReader.CreateTextReader(stream, Encoding.UTF8,
                                                                         new XmlDictionaryReaderQuotas(), null))
                {
                    var xmlSer = new XmlSerializer(typeof (T));

                    return xmlSer.Deserialize(xmlReader) as T;
                }
            }

     private static String GetFilePath(String fileName)
        {
            var asmUri = new Uri(Assembly.GetExecutingAssembly().CodeBase);

            if (asmUri.IsFile)
            {
                var asmFolder = Directory.GetParent(asmUri.LocalPath);

                return Path.Combine(asmFolder.FullName, fileName);
            }

            throw new Exception();
        }

答案 3 :(得分:1)

您需要使用Load()方法加载文件,然后为每个值创建一个新的Testtype。由于每个Type都是根节点的子节点,因此Elements()是您想要的而不是Descendants()

class Testtypes
{
    public string Type;

    public static List<Testtypes> getTypes()
    {
        var doc = XDocument.Load("test.xml");
        return doc.Root.Elements("Type")
                   .Select(x => new Testtypes
                   {
                       Type = x.Value
                   }
                   .ToList();
    }
}

答案 4 :(得分:1)

如果我的xml如此简单,我会这样做

var myList=XElement.Load("data.xml")
                   .DescendantNodes()
                   .Where(N => N.NodeType == XmlNodeType.Text);