如何最好地呈现文件中的XML值给用户?

3

我有一个XML文件,看起来类似于这样:

<root>
 <carnumber>12</carnumber>
 <carcolor>2</carcolor>
 <cartype>5</cartype>
</root>

就像你所看到的,我有一些带有值/文本的元素。例如,汽车元素可以从1到1000取值。但是,车辆颜色元素可以从1-5取值,车辆类型可以从1-10取值。
重要的是,车辆颜色和车辆类型元素的值具有特定意义。例如,车辆颜色"2"表示红色,"1"表示蓝色,以此类推。
因此,我需要向用户呈现的不是值,而是这些值的实际含义。
我发现自己正在创建一些代表具有有效值的元素的类,情况变得非常复杂,我不知道这是否是最佳途径。
我的一位朋友建议我使用XML序列化,因为我的XML文件是静态的。它永远不会改变。
我的问题很简单。我只想知道您将如何解决此问题。我的想法包括代表XML元素的类,例如cartype,在此类中,我有一个字典,其中包含一对。这代表XML文件中的值,而字符串则是该值的含义。我使用了大量的LINQ来导航和编辑这些值。
再次感谢!

同时,我必须给用户以友好的方式编辑这些值。这意味着如果用户想要编辑颜色,我必须表示所有有效的颜色。就像一个下拉框,其中包含诸如“蓝色”,“红色”之类的值...但是我必须再次生成一个有效的XML。 - TomyTomy
XML文件已经给定,我无法对其进行任何更改。 - TomyTomy
4个回答

3

这可以是复杂或简单的,取决于您希望它变得多么复杂。但我想,您的朋友建议使用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 字段,并在内部序列化与之相关的数字。同样,也可以暴露汽车的 Color 枚举类型,并在内部存储一个数值。

这可以帮助我加载和保存文件,但是数据的展示呢? - TomyTomy
这取决于您如何实现表单。然而,最基本的方法是,首先在标签中显示值。 - James
对于颜色,您可以为上述解决方案创建枚举。 - Lalit
2
还要看它是否需要国际化或仅限于英语。 - slf

1

试一试这个:

[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...
}

我已经添加了一些枚举类型以允许展示。

您可以设置一个汽车的值并将其序列化为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);

0
为什么不像这样更格式化你的XML文件:
<root>
 <carnumber code="2" name="John's Car"/>
 <carcolor code="3" name="Red"/>
 <cartype code="2" name="Hatchback"/>
</root>

XML文件已给定,我无法对其进行任何更改。但是使用XSLT,我可以实现更改。 - TomyTomy

0

我会在WPF中构建UI,而不是WinForms。设置一个数据上下文,将其绑定到XML作为XML数据源,编写类型转换器以在内部和人类可读值之间往返传输数据,将组合框绑定到各种元素,然后就完成了。

我知道如果您不使用WPF,这个答案对您来说并没有太大用处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接