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