2010-01-18 5 views
3

Я получил XML-файл, глядя знакомы с этим:Лучший способ представить пользователю значения XML файла?

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

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

Важно, чтобы значения элементов carcolor и cartype что нибудь. carcolor «2» означает красный, «1» синий и т. д.

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

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

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

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

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

+0

Также я должен предоставить Пользователю возможность редактировать эти значения и, как вы знаете, удобным для пользователя способом. Это означает, что если пользователь хочет изменить цвет, я должен представлять все допустимые цвета. Подобно combobox со значениями, такими как «Синий», «Красный» .... но чем я должен снова создать корректный XML. – 2010-01-18 15:41:12

+0

Файл XML указан так. Я не могу делать никаких изменений. – 2010-01-18 15:55:03

ответ

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

Спасибо, это даст мне правильный толчок: D – 2010-01-22 08:51:52

0

Почему не формат файла XML больше похож:

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

Файл XML указан так. Я не могу делать никаких изменений. Но с XSLT я мог это сделать. – 2010-01-18 15:56:25

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(); 

Вы могли бы еще больше улучшить это, подвергая custom enum для таких, как ваше поле Type и внутренняя сериализация номера, относящегося к нему. Кроме того, возможно, выставляя номер Color для автомобиля и внутренне сохраняя числовое значение.

+0

Это поможет мне загрузить и сохранить файл, да. Но как насчет представления данных? – 2010-01-18 16:03:45

+0

Это зависит от того, как вы реализуете свои формы. Однако, как только вы можете получить, просто покажите значения в ярлыках, чтобы начать с. – James

+0

Для цвета вы можете создать перечисление для указанного выше решения. – Lalit

0

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

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

+0

И я тоже. К сожалению :( – 2010-01-19 13:59:56

Смежные вопросы