Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解析xml smart?(使用状态机?)_C#_Xml_Algorithm_Serialization_State Machine - Fatal编程技术网

C# 如何解析xml smart?(使用状态机?)

C# 如何解析xml smart?(使用状态机?),c#,xml,algorithm,serialization,state-machine,C#,Xml,Algorithm,Serialization,State Machine,我需要解析一个XML配置文件,以便我的程序能够读取XML命令并响应它们。 例如,我需要用规则解析一些对象: 选择所有对象 选择一些对象 忽略这些对象中的属性 等等 这些命令将来自xml文件 这是我的文件的外观: <model name="testModel" AllObjects="false"> <objectType name="class1" allProperties="true"

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

  • 选择所有对象
  • 选择一些对象
  • 忽略这些对象中的属性
  • 等等
这些命令将来自xml文件

这是我的文件的外观:

<model name="testModel" AllObjects="false">
   <objectType name="class1" allProperties="true"/>
   <objectType name="class2" allProperties="false">
     <IncludeProperty name="property1"/>
   </model>
但是我如何使用它呢? 我应该使用状态机来处理这个问题吗?如果是,我做得对吗

谢谢大家!


另外,我需要关于状态机及其逻辑的帮助(或者其他方法)。不是Xml解析(刚才:)

您不需要自己的Xml解析器。您需要。

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

为什么要重新发明轮子并编写自己的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; }

}
[XmlRoot(“模型”)]
公共类命令模型
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlAttribute(“AllObject”)]
公共bool AllObjects{get;set;}
[XmlElement(“对象类型”)]
公共列表对象类型{get;set;}
}
[XmlRoot(“objectType”)]
公共类对象类型
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlAttribute(“所有属性”)]
公共bool AllProperties{get;set;}
[XmlElement(“IncludeProperty”)]
公共列表IncludedProperties{get;set;}
}
[XmlRoot(“IncludeProperty”)]
公共类财产
{
[XmlAttribute(“名称”)]
公共字符串名称{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 ) ;
}
public static T再水化(文本阅读器文本阅读器)
{
XmlSerializer serializer=新的XmlSerializer(typeof(T));
对象o=序列化程序。反序列化(textReader);
T实例=(T)o;
返回实例;
}
然后调用它,类似这样:

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 ) ;
}
string myDocument=@”
" ;
命令模型;
使用(StringReader=新StringReader(myDocument))
{
型号=再水合(读卡器);
}
这就是全部。将模型序列化为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 ;
}
公共静态字符串(T实例)
{
XmlSerializer serializer=新的XmlSerializer(typeof(T));
StringBuilder sb=新的StringBuilder();
使用(StringWriter=新StringWriter(sb))
{
serializer.Serialize(编写器、实例);
}
字符串xml=sb.ToString();
返回xml;
}

尽管您可能希望创建适当的
XMLWriter
XMLReader
实例,这些实例被配置为漂亮地打印生成的XML,并以您希望的方式读取XML。

为什么要重新发明轮子,编写自己的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; }

}
[XmlRoot(“模型”)]
公共类命令模型
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlAttribute(“AllObject”)]
公共bool AllObjects{get;set;}
[XmlElement(“对象类型”)]
公共列表对象类型{get;set;}
}
[XmlRoot(“objectType”)]
公共类对象类型
{
[XmlAttribute(“名称”)]
公共字符串名称{get;set;}
[XmlAttribute(“所有属性”)]
公共bool AllProperties{get;set;}
[XmlElement(“IncludeProperty”)]
公共列表IncludedProperties{get;set;}
}
[XmlRoot(“IncludeProperty”)]
公共类财产
{
[XmlAttribute(“名称”)]
公共字符串名称{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 ) ;
}
public static T再水化(文本阅读器文本阅读器)
{
XmlSerializer serializer=新的XmlSerializer(typeof(T));
对象o=序列化程序。反序列化(textReader);
T实例=(T)o;
返回实例;
}
然后调用它,类似这样:

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 ) ;
}
string myDocument=@”
" ;
命令模型;
使用(StringReader=新StringReader(myDocument))
{
型号=再水合(读卡器);
}
这就是全部。将模型序列化为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 ;
}
公共静态字符串(T实例)
{
XmlSerializer serializer=新的XmlSerializer(typeof(T));
StringBuilder sb=新的StringBuilder();
使用(StringWriter=新StringWriter(sb))
{
serializer.Serialize(编写器、实例);
}
字符串xml=sb.ToString();
返回xml;
}

尽管您可能希望创建适当的
XMLWriter
XMLReader
实例,这些实例被配置为漂亮地打印生成的XML,并以您希望的方式读取XML。

是否特别要求您编写XML解析器?如果不是的话,解析它的聪明方法就是使用一个好的库。有没有特别要求您编写XML解析器?如果不是聪明的方式来解析它是一个很好的库。谢谢!但是为什么model.ObjectTypes.Count()==0?谢谢!但为什么model.ObjectTypes.Count()==0?