2009-06-11 116 views
1

我在Visual Studio 2008中构建游戏,为了构建关卡,我将有两种类型的文件(实际上超过了这些,但这两个是唯一对我的问题重要的),我需要解析。一个将决定一个级别的内容,将是这个样子:C#中的文件解析#

LevelName = “样品等级”

Object1Type = “CustomObject”

Object1File = “WideFloor_DF”

Object1Position = 600600

Object2Type = “圆”

Object2Position = 550,500

Object2Mass = 5

另一个将决定对自定义对象的属性,并且是这个样子:

NAME = “宽幅地板”

质量= 1

GeometryMap =“WideFloor_GM”

IsStatic =真正

我不是很熟悉的正则表达式(读:我不喜欢他们,因为外观太像线路噪声很容易理解的),我想知道如果有一个更简单的方法比使用大量的正则表达式?

编辑:我知道我忘了一些东西!我真的很讨厌xml文件,所以我真的不想使用它们(waaaaaaaay对我来说太冗长)。 编辑2:我喜欢我提出的格式,并且不希望改变。

+0

有趣的是,下面提供的示例Robert Harvey需要的字符数少于“格式”,因为它不需要重复“Object1”一遍又一遍。 – Talljoe 2009-06-11 05:51:24

+1

那么,我们已经编写了一个完整的C#编译器,而不使用任何正则表达式。我想你可以解析一个比C#更简单的语言,而不使用正则表达式。解析语言是一个经过深入研究,常见的问题,因此有大量的文献可供参考。首先编写一个标记器,一个将字符流转换为标记流的设备。然后构建一个解析器,将令牌流转换为这些代表的任何数据结构的流。 – 2009-06-11 06:30:40

+0

感谢您的想法,我可能会在某个时候做到这一点,但现在我会坚持使用XML。 – RCIX 2009-06-11 06:41:40

回答

7

使用XML文件怎么样?您可以使用XMLReader和XMLWriter对象轻松读取和写入它们,而不必处理Regex。

<Level name="Sample Level"> 
    <Object type="CustomObject" file="WideFloor_DF" positionX="600" positionY="600" /> 
    <Object type="Circle" file="WideFloor_DF" positionX="500" positionY="500" mass="5" /> 
</Level>  
+0

感谢您的尝试,这种方式看起来很有吸引力,但我想我有xmlphobia。抱歉! – RCIX 2009-06-11 05:41:40

1

如果您打算让您的文件采用人类可读的格式,为什么不使用XML?

1

如果你有对文件格式的控制权,你可以尝试一下现有的解析器,比如XML或INI文件,它们都有.NET中的解析器。

如果以上述格式销售,您可以使用类似Lex的工具为您生成解析器。

1

一种替代方法可能是定义一个具有属性/集合的类来保存所有这些配置数据,并使其成为[Serializable]。然后,您可以填充一个示例配置,将其序列化为一个文件,然后您就拥有一个完整的XML配置文件,您可以手动编辑它。准备好使用配置时,只需将XML文件反序列化回应用中的配置对象即可。

0

好吧,如果我理解你的问题,你想要一种方法来构造文件的内容,以便解析将会更容易为你,XML是一个很好的选择,而XSD也描述你的内容xml文件,LINQ to XML将使它很好地从C#中读取。

0

如果您使用XML,您可以将文件直接反序列化到一个对象中,这样您根本不需要解析它。

1

如果您绝对坚持使用该文件格式,您可以构建一个逐行读取文件的对象,将'='左侧的内容拉到字典中作为密钥以及所有内容'='作为Value的权利。

但是,我必须回应上述的答案,说使用XML文档和XMLDocument对象。你看过LINQ to XML吗?

0

为什么不用二进制序列化您的对象。