2012-03-24 79 views
0

我有一個要求,一個字符串是這樣的:轉換分組SQL語句XML

[頁] < '10',[頁]> '30' 號和([Client.ShortName] =「測試'或者[Review_Stage.Name] = '完成' 或([ReviewCoreExt.ActiveReviewer] = 'ABC' 而[Client.IsDemo] = '真'))

並將其轉換爲XML這樣的:

<Filter> 
    <FilterGroup ID="91140d9e-e805-4fa1-b86b-cdea197a279d" GroupType="And"> 
     <FilterCriteria ID="4950b1c8-cf04-48cb-be1a-247bbec5d2f7" MatchField="Pages" MatchType="Is Less Than" MatchValue="10" /> 
     <FilterCriteria ID="351f180d-0c65-430a-a64c-840c93d22a6e" MatchField="Pages" MatchType="Is Greater Than" MatchValue="30" /> 
     <FilterGroup ID="85662ed6-4377-434d-8185-cb52ec908a90" GroupType="Or"> 
     <FilterCriteria ID="c5698b82-678f-42a7-a917-c1388edf3274" MatchField="Client.ShortName" MatchType="Equals" MatchValue="Test" /> 
     <FilterCriteria ID="242746c6-013a-4f1c-9ace-efadeb5fdd9d" MatchField="Review_Stage.Name" MatchType="Equals" MatchValue="Complete" /> 
     <FilterGroup ID="cf8fcd62-b752-4b12-ae65-3f39fe9022f4" GroupType="And"> 
      <FilterCriteria ID="737cf486-e40b-47e4-8473-886e126d84a9" MatchField="ReviewCoreExt.ActiveReviewer" MatchType="Equals" MatchValue="ABC" /> 
      <FilterCriteria ID="abbfae00-2582-47b4-833a-bfaa0190fb9a" MatchField="Client.IsDemo" MatchType="Equals" MatchValue="True" /> 
     </FilterGroup> 
     </FilterGroup> 
    </FilterGroup> 
    </Filter> 

Guid只是一個新的Guid()。有沒有人有一個相對簡單的方法來做這樣的事情?理論上這些小組可以嵌套無數次,但實際上很少有2-3個以上的級別。

回答

0

我看到2種方法:

1)使用詞法分析器。它會要求作品,但你會有強大的東西,並能夠「讀」任何東西。 ANTLR是.NET的詞法分析器,您需要編寫它如何分解這些單詞。

2)給自己寫一段代碼,根據特定的詞(And,Or)和特定的運算符(<,>,=,< =,> = =)分割句子。在你的情況下,它應該很容易,因爲這些單詞的數量非常有限。

您需要設計一個「Predicate」對象:一個具有左操作數,一個操作符和一個右操作數的對象。操作數將是值,字段或謂詞(以允許遞歸和/或)。 從這些分裂您建立不同的謂詞的列表,一旦你這棵樹,它會很容易把它翻譯成XML

我希望它能給你在正確的方向的第一步