[英]Best way to present the user the XML values of a file?
我有一个XML文件,看起来很熟悉:
<root>
<carnumber>12</carnumber>
<carcolor>2</carcolor>
<cartype>5</cartype>
</root>
就像你看到我得到了一些带有值/文本的元素。 例如,car元素可以取1到1000之间的值。但是carcolor元素可以取值为1到5,而cartype取值为1到10。
重要的是carcolor和cartype元素的值意味着什么。 carcolor“2”表示红色,“1”表示蓝色,依此类推。
所以我需要向用户呈现值而不是值的真正含义。
我发现自己创建了一些代表具有有效值的元素的类,事情变得非常复杂,我不知道这是否是最佳方式。
我的一个朋友建议我使用XML序列化,因为我的XML文件是静态的。 它永远不会改变。
我的问题很简单。 我只想知道你将如何解决这个问题。 我的想法包含代表XML元素的类,例如这个类中的cartype我有一对Dictonary。 这表示XML文件中的值,字符串是此值的含义。 我使用了很多Linq来导航和编辑值。
再次感谢!
这可以像你想要的那样复杂或简单。 但是,我会建议朋友使用XML序列化,例如:
[XmlRoot("Car")]
public class Car
{
public Car()
{
}
[XmlElement("Number")]
public int Number { get; set; }
[XmlElement("Color")]
public int Color { get; set; }
[XmlElement("Type")]
public int Type { get; set; }
}
连载:
Car myCar = new Car();
myCar.Number = 1;
myCar.Color = 2;
myCar.Type = 3;
XmlSerializer s = new XmlSerializer(typeof(Car));
TextWriter w = new StreamWriter( @"c:\Car.xml" );
s.Serialize(w, myCar);
w.Close();
反序列化:
Car myCar;
TextReader r = new StreamReader("Car.xml");
myCar = (Car)s.Deserialize(r);
r.Close();
您可以通过为Type
字段之Type
的公开自定义枚举并在内部序列化与其相关的数字来进一步改进此功能。 也许可以为汽车公开Color
enum并在内部存储数值。
尝试一下:
[XmlRoot("root")]
public class Car
{
private static XmlSerializer serializer = new XmlSerializer(typeof(Car));
[XmlElement("carnumber")]
public int Number { get; set; }
[XmlElement("carcolor")]
public int Color { get; set; }
[XmlElement("cartype")]
public int Type { get; set; }
[XmlIgnore]
public CarColor CarColor
{
get
{
return (CarColor)Color;
}
set
{
Color = (int)value;
}
}
[XmlIgnore]
public CarType CarType
{
get
{
return (CarType)Type;
}
set
{
Type = (int)value;
}
}
public string CarColorString
{
get
{
return this.CarColor.ToString().Replace('_', ' ');
}
}
public string CarTypeString
{
get
{
return this.CarType.ToString().Replace('_', ' ');
}
}
public string Serialize()
{
StringBuilder sb = new StringBuilder();
using (StringWriter writer = new StringWriter(sb))
{
serializer.Serialize(writer, this);
}
return sb.ToString();
}
public static Car Deserialize(string xml)
{
using (StringReader reader = new StringReader(xml))
{
return (Car)serializer.Deserialize(reader);
}
}
}
public enum CarColor
{
Red = 1,
Blue = 2,
Green = 3,
Light_Brown = 4
// and so on...
}
public enum CarType
{
Sedan = 1,
Coupe = 2,
Hatchback = 3,
SUV = 4,
Pickup_Truck = 5
// and so on...
}
我添加了一些枚举以允许演示。
您可以设置Car的值并将其序列化为xml字符串:
Car car = new Car();
car.Number = 1;
car.CarColor = CarColor.Blue;
car.CarType = CarType.Coupe;
string xml = car.Serialize();
并将xml字符串反序列化为汽车:
string example =
@"<root>
<carnumber>12</carnumber>
<carcolor>2</carcolor>
<cartype>5</cartype>
</root>";
Car car = Car.Deserialize(example);
对于演示,您可以使用CarColorString和CarTypeString属性,如果您的枚举值包含多个单词,则使用空格替换下划线。
Console.WriteLine(car.CarColorString);
Console.WriteLine(car.CarTypeString);
为什么不格式化XML文件更像:
<root>
<carnumber code="2" name="John's Car"/>
<carcolor code="3" name="Red"/>
<cartype code="2" name="Hatchback"/>
</root>
我会在WPF中构建UI,而不是WinForms。 设置一个数据上下文,它将XML绑定为XML数据源,写入类型转换器以在内部和人类可读值之间往返数据,将组合框绑定到各种元素,Bob是你的叔叔。
我认识到如果您不使用WPF,这个答案对您来说并不是很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.