我要求使用这样的字符串:
[页数]< '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 :(得分:0)
我看到有两种方法可以做到这一点:
1)使用词法分析器。它会要求作品,但你会有强大的东西,并能够“阅读”任何东西。 ANTLR是.NET的词法分析器,你需要写下它如何分解单词。
2)给自己写一个代码,根据特定的单词(和,或),然后是特定的运算符(&lt;,&gt;,=,&lt; =,&gt; =)来分割句子。在你的情况下,它应该很容易,因为这些单词的数量非常有限。
您需要设计一个“Predicate”对象:一个具有左操作数,一个运算符和一个右操作数的对象。操作数将是值,字段或谓词(允许递归和/或)。 从这些拆分中你可以构建一个不同谓词的列表,一旦你拥有了这个树,就很容易将它翻译成XML
我希望它能为你提供正确方向的第一步