2012-03-24 75 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

我希望它能给你在正确的方向的第一步