什么XML或JSON或???数据格式可以描述一组复杂的要求吗?

时间:2016-01-09 23:46:52

标签: json xml xsd swagger jsonschema

我需要表达

  • 在预先录取的课程中通过成绩,以便访问下一个。
  • 上述豁免政策,教授可以超越要求。
  • 学生在给定的时间(年)内只能获得一项此类豁免
  • 学生必须年满21岁
  • 学生只能注册3个符合条件的专业

或类似地,NY DMV有complex set of documents and prerequisites以获得驾驶执照。

问题

  • 哪种抽象语法可以让我以平台中立的方式描述上面列出的规则?

用例

我正在开发一个应用程序,用户可以定义访问某些数据的资格规则。这些规则可能具有先决条件或访问它的键/值范围。

我在想XML,但这可能会变得很麻烦。就像swagger已成为处理Web服务的“更简单方法”一样,我正在寻找类似的“简单”语法来处理这些规则。

1 个答案:

答案 0 :(得分:1)

EDIT2: 为了更准确,我重新构建了我的答案......

主题的背景实际上是我认为的实体关系管理。我无法与之相提并论......有关该主题的更多信息:Entity–relationship model 这似乎是一个多用户问题,使用数据库将帮助您。您可以在哪里定义一些访问权限。 另一方面,在现实世界中,这将是服务器/客户端(云)场景。在MS平台上可能有实体框架......有关该主题的更多信息:Entity Framework

XML和JSON格式都非常平台。

如果您选择XML,那么您可以使用XSD定义一些约束,稍后您可以使用它来验证采集的数据。此外,您可以使用XSLT文件以多种不同方式转换或表示数据。

为了理解使用XSD的XML验证,您可以找到这个link

为了更具体,我们必须进一步定义一些结构和实验。所以让我们作为实验:

<Users>
  <User>
    <Identity ID="2015/PHY/S001201">
      <Name>My First Student</Name>
      <SomeOtherDetails/>
    </Identity>
    <Certificates>
      <Certificate ID="2015/PHY/M001/V01" Name="Math I.">
        <State>Finished</State>
        <Grade>Excellent</Grade>
        <Date>30.12.2015</Date>
      </Certificate>
      <Certificate ID="2015/PHY/M001/V01" Name="Math I.">
        <State>Finished</State>
      </Certificate>
    </Certificates>
  </User>
</Users>

现在我们可以创建一些规则:

<xsl:output method="xml" indent="yes" encoding ="utf-8"/>

<xsl:template match="/Users">
  <Result>
    <xsl:for-each select="./User">
      <xsl:apply-templates select="."/>
    </xsl:for-each>
  </Result>
</xsl:template>

<!-- This is my rule: user can apply only if he/she fills the requirements -->
<xsl:template match="User[ Certificates/Certificate/@ID = '2015/PHY/M001/V01' and Certificates/Certificate/State = 'Finished'  ]">
  <xsl:copy>
    <xsl:apply-templates select="Identity"/>
    <Course ID="2012/PHY/M002/V03">
      <Permission>Granted</Permission>
    </Course>
  </xsl:copy>
</xsl:template>

<xsl:template match="User"/>

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

注意:实际匹配模式有一些错误,打算说明这个概念!

这是输出:

<Result>
  <User>
    <Identity ID="2015/PHY/S001201">
      <Name>My First Student</Name>
      <SomeOtherDetails></SomeOtherDetails>
    </Identity>
    <Course ID="2012/PHY/M002/V03">
      <Permission>Granted</Permission>
    </Course>
  </User>
</Result>

因此,一般来说,我们必须描述具有特定属性的学生和教授。

回答:所以XML / XSLT肯定可以表达非常复杂的数据和条件!