2013-09-18 2 views
0

Мне нужно разобрать файл конфигурации XML, чтобы моя программа могла читать команды xml и отвечать на них. Например, мне нужно разобрать несколько объектов с правилами:Как разобрать xml smart? (Использовать конечный автомат?)

  • Выделить все объекты
  • Выберите несколько объектов
  • Игнорировать недвижимость в этих объектах.
  • И так далее.

Эти команды будут поступать из файла xml.

Это то, что мой файл выглядит следующим образом:

<model name="testModel" AllObjects="false"> 
    <objectType name="class1" allProperties="true"/> 
    <objectType name="class2" allProperties="false"> 
    <IncludeProperty name="property1"/> 
    </model> 

Итак, какой метод следует использовать? Государственный аппарат? Или что-то другое?

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

Я попытался создать некоторые состояния - состояние Init, AllObjectsTrue, AllObjectsFalse, AllPropertiesTrue, AllPropertiesFalse.

Я пытаюсь создать простой график моего проекта. Но я не уверен, что все в порядке. gliffy diagramm

код у меня до сих пор:

class StateMachine 
{ 
    private enum State 
    { 
     INIT, AllObjectsTrue, AllObjectsFalse, 
     AllPropertiesTrue, AllPropertiesFalse, EXIT 
    } 
    private State state; 
    void setState(State value) 
    { 
     switch (state) 
     { 
      case State.INIT: 
       break; 
      case State.AllObjectsTrue: 
       break; 
      case State.AllObjectsFalse: 
       break; 
      case State.AllPropertiessTrue: 
       break; 
      case State.AllPropertiessFalse: 
       break; 

      case State.EXIT: 
       break; 
     } 

    } 
    void eventHandler() 
    { 
     switch (state) 
     { 
      case State.INIT: 
       break; 
      case State.AllObjectsTrue: 
       break; 
      case State.AllObjectsFalse: 
       break; 
      case State.AllPropertiessTrue: 
       break; 
      case State.AllPropertiessFalse: 
       break; 

      case State.EXIT: 
       break; 
     } 
    } 
} 

Но как его использовать? Должен ли я использовать для этого государственный автомат? И если так, я сделал это правильно?

Спасибо!

P.S. Мне нужна помощь с автоматом и его логикой (или другим способом для этого). Не Xml parse (только сейчас :))

+0

Вам было предложено написать XML-парсер? Если не разумный способ разобрать, это хорошая библиотека. – evanmcdonnal

ответ

2

Почему вы хотите изобрести колесо и написать свои собственные процедуры синтаксического анализа XML?

Все, что вам нужно, это атрибуты XML Serialization и встроенная сериализация/де-сериализация CLR на основе атрибутов.Посмотрите на пространство имен:

  • System.Xml
  • System.Xml.Serialization

Во-первых, разметить модель класс (ы) соответствующим образом:

[XmlRoot("model")] 
public class CommandModel 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlAttribute("AllObjects")] 
    public bool AllObjects { get; set; } 

    [XmlElement("objectType")] 
    public List<ObjectType> ObjectTypes { get; set; } 

} 

[XmlRoot("objectType")] 
public class ObjectType 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlAttribute("allproperties")] 
    public bool AllProperties { get; set; } 

    [XmlElement("IncludeProperty")] 
    public List<Property> IncludedProperties { get; set; } 

} 

[XmlRoot("IncludeProperty")] 
public class Property 
{ 

    [XmlAttribute("name")] 
    public string Name { get; set; } 

} 

Затем создать метод, чтобы сделать ваш регидратации для вы, что-то вроде этого:

public static T Rehydrate<T>(TextReader textReader) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T)) ; 
    object o = serializer.Deserialize(textReader) ; 
    T instance = (T) o ; 
    return instance ; 
} 

Затем вызовите его, что-то вроде этого:

string myDocument = @" 
<model name=""testModel"" AllObjects=""false"" > 
    <objectType name=""class1"" allProperties=""true"" /> 
    <objectType name=""class2"" allProperties=""false"" > 
    <IncludeProperty name=""property1""/> 
    </objectType> 
</model> 
" ; 

CommandModel model ; 
using (StringReader reader = new StringReader(myDocument)) 
{ 
    model = Rehydrate<CommandModel>(reader) ; 
} 

Вот и все, что нужно сделать. Сериализация модели для Xml не намного сложнее. Что-то, как это будет делать вам:

public static string Dehydrate<T>(T instance) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    StringBuilder sb = new StringBuilder() ; 
    using (StringWriter writer = new StringWriter(sb)) 
    { 
    serializer.Serialize(writer,instance) ; 
    } 
    string xml = sb.ToString() ; 
    return xml ; 
} 

Хотя вы можете захотеть создать соответствующие XMLWriter и XMLReader экземпляры, настроенные на довольно-печати результирующего XML и читать ваш XML так, как вы хотите его прочитать.

+0

Спасибо! Но почему model.ObjectTypes.Count() == 0? – user2545071

2

Вам не нужен ваш собственный синтаксический анализатор XML. Вам нужно LINQ to XML.

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