将分组的SQL语句转换为XML

本文关键字:转换 XML 语句 SQL | 更新日期: 2023-09-27 18:28:50

我需要一个字符串,如下所示:

[Pages]<'10'和[Pages]>'30'和([Client.ShortName]='Test'或[Review_Stage.Name]='Complete'或([ReviewCoreExt.ActiveReviewer]='ABC'和[Client.IsDemo]='True')

并将其转换为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个级别。

将分组的SQL语句转换为XML

我看到了两种方法:

1) 使用词法分析器。它会要求作品,但你会有一些强大的东西,并且能够"阅读"任何东西。ANTLR是.NET的词法分析器,您需要编写它如何分解单词。

2) 给自己写一个代码,根据特定的单词(And,Or)和特定的运算符(<,>,=,<=,>=)来拆分句子。在你的情况下,这应该很容易,因为这些单词的数量非常有限。

您需要设计一个"谓词"对象:一个有左操作数、运算符和右操作数的对象。操作数将是值、字段或谓词(以允许和/或中的递归性)。通过这些拆分,您可以构建一个不同谓词的列表,一旦您有了这个树,就可以很容易地将其转换为XML

我希望它能让你朝着正确的方向迈出第一步