0

我需要解析一个 XML 配置文件,以便我的程序可以读取 xml 命令并响应它们。例如,我需要用规则解析一些对象:

  • 选择所有对象
  • 选择一些对象
  • 忽略这些对象中的属性。
  • 等等。

这些命令将来自一个 xml 文件。

这是我的文件的样子:

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

那么,我应该使用什么方法呢?状态机?或者是其他东西?

我尝试使用状态机,但不完全理解它是如何工作的。

我尝试创建一些状态 - 初始化状态、AllObjectsTrue、AllObjectsFalse、AllPropertiesTrue、AllPropertiesFalse。

我尝试为我的项目创建简单的图表。但我不确定这一切都好。 闪烁的图表

我到目前为止的代码:

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;
        }
    }
}

但是我该如何使用它呢?我应该对此使用状态机吗?如果是的话-我做对了吗?

谢谢!

PS我需要状态机及其逻辑(或其他方法)的帮助。不是 Xml 解析(只是现在:))

4

2 回答 2

2

为什么要重新发明轮子并编写自己的 XML 解析例程?

您所需要的只是 XML 序列化属性和 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。

于 2013-09-18T18:37:03.303 回答
2

您不需要自己的 XML 解析器。您需要LINQ to XML

于 2013-09-18T17:43:28.823 回答