2009-06-11 61 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

爲什麼不用二進制序列化您的對象。