2

我想读取一个 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.();
        }
    }
4

5 回答 5

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();
}
于 2012-11-09T13:54:21.287 回答
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;
}

祝你好运

于 2012-11-09T14:06:09.950 回答
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();
        }
于 2012-11-09T14:02:26.987 回答
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();
    }
}
于 2012-11-09T15:11:38.963 回答
1

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

var myList=XElement.Load("data.xml")
                   .DescendantNodes()
                   .Where(N => N.NodeType == XmlNodeType.Text);
于 2012-11-09T15:48:00.387 回答