我有这样的xml文件
<Student>
<column Type="String">Name</column>
<column Type="Int32">Age</column>
</Student>
我正在使用 VS2008。我不知道运行时的列。即额外的列可以添加到 xml 文件中。
现在我的问题是如何创建这个类并将这个类型(创建的类)存储在(C#)Generics.ie List 等中。
任何帮助,将不胜感激。
这真的很难;如果您绝对想将其作为运行时类,则必须查看TypeBuilder
等。坦率地说,除非您已经熟悉它,或者这非常重要,否则可能不值得。尤其重要的是:您不能真正针对此类对象进行编码,除了object
.
您最好的选择可能是使用某种 DOM(XmlDocument
等XElement
)来读取数据,但可能会填充到DataTable
. 我不是DataTable
常规代码的忠实拥护者,但它确实存在,并且非常适合这种情况。
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
DataTable table = new DataTable();
foreach(XmlElement child in doc.DocumentElement.SelectNodes("column"))
{
table.Columns.Add(child.InnerText, ParseType(child.GetAttribute("Type")));
}
....
static Type ParseType(string type)
{
switch(type)
{
case "String": return typeof(string);
case "Int32": return typeof(int);
default: throw new NotSupportedException(type ?? "(null)");
}
}
首先创建一个名为 Student 的类并使其可序列化,然后添加 2 个属性 Name 和 Age。
然后将xml提供给这个函数
public static Object XMLStringToObject(string xml, Type objectType)
{
object obj = null;
XmlSerializer ser = null;
StringReader stringReader = null;
XmlTextReader xmlReader = null;
try
{
ser = new XmlSerializer(objectType);
stringReader = new StringReader(xml);
xmlReader = new XmlTextReader(stringReader);
obj = ser.Deserialize(xmlReader);
}
catch
{
//Do nothing for now
}
finally
{
xmlReader.Close();
stringReader.Close();
}
return obj;
}
还有更多更小的序列化函数,但这只是为了快速向你展示如何序列化你的对象,因为通常你会使用XMLStringToObject<T>