C# 如何解析xml smart?(使用状态机?)
我需要解析一个XML配置文件,以便我的程序能够读取XML命令并响应它们。 例如,我需要用规则解析一些对象: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"
- 选择所有对象
- 选择一些对象
- 忽略这些对象中的属性
- 等等
<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?