Лучший способ представить пользователю значения XML файла? - PullRequest
3 голосов
/ 18 января 2010

У меня есть XML-файл, который мне знаком:

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

Как вы видите, у меня есть некоторые элементы со значениями / текстом. Например, элемент car может принимать значения от 1 до 1000. Но элемент carcolor может принимать значения от 1 до 5, а тип карты от 1 до 10.

Важно то, что значения элементов carcolor и cartype что-то значат. carcolor "2" означает красный, "1" синий и т. д.

Так что мне нужно представить пользователю не значения, а реальное значение значений.

Я обнаружил, что создаю несколько классов, представляющих элементы с допустимыми значениями, и все становится действительно сложным, и я не знаю, был ли это лучший способ.

Мой друг предложил мне использовать сериализацию XML, потому что мой файл XML статичен. Это никогда не изменится.

Мой вопрос прост. Я просто хочу знать, как вы решите эту проблему. Моя идея содержит классы, которые представляют элемент XML, например, Cartype внутри этого класса У меня есть Dictonary с парой. Это представляет значения в файле XML, и строка является значением этого значения. И я использую много Linq для навигации и редактирования значений.

Еще раз спасибо!

Ответы [ 4 ]

3 голосов
/ 18 января 2010

Это может быть так сложно или просто, как вы хотите. Я бы, однако, поддержал предложение ваших друзей использовать 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 для автомобиля и внутреннее хранение числового значения.

1 голос
/ 18 января 2010

Попробуйте:

[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);
0 голосов
/ 19 января 2010

Я бы создал пользовательский интерфейс в WPF, а не в WinForms. Настройте контекст данных, который привязывается к XML как источнику данных XML, запишите преобразователи типов для двусторонней передачи данных между внутренними и понятными для человека значениями, свяжите комбинированные блоки с различными элементами и Боб - ваш дядя.

Я понимаю, что этот ответ не очень полезен для вас, если вы не используете WPF.

0 голосов
/ 18 января 2010

Почему бы не отформатировать XML-файл, например:

<root>
 <carnumber code="2" name="John's Car"/>
 <carcolor code="3" name="Red"/>
 <cartype code="2" name="Hatchback"/>
</root>
...