gpt4 book ai didi

c# - 如何智能解析xml?(使用状态机?)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:47 26 4
gpt4 key购买 nike

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

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

这些命令将来自 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;
}
}
}

但是我该如何使用它呢?我应该为此使用状态机吗?如果是的话——我这样做对吗?

谢谢!

附言我需要有关状态机及其逻辑的帮助(或其他方法)。不是 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; }

}

然后创建一个方法来为您补液,如下所示:

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

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

关于c# - 如何智能解析xml?(使用状态机?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18878845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com