Python 如何定义应用程序';XML文件中的验证规则

Python 如何定义应用程序';XML文件中的验证规则,python,xml,vb.net,Python,Xml,Vb.net,我有一个应用程序,它根据一些设置的规则验证CSV文件。应用程序检查CVS中的某些“列/字段”是否标记为必填,其他应用程序检查其必填状态是否基于其他字段。例如,第2列对第5列进行了条件检查,如果第5列有值,则第2列也必须有值 我已经用VB和Python实现了这一点。问题是这个逻辑在应用程序中是硬编码的。我想要的是将这些规则移动到一个XML中,应用程序将在其中读取该XML并处理该文件。如果处理规则发生了变化——并且经常发生变化——那么应用程序保持不变,只有XML发生了变化 以下是python中的两个

我有一个应用程序,它根据一些设置的规则验证CSV文件。应用程序检查CVS中的某些“列/字段”是否标记为必填,其他应用程序检查其必填状态是否基于其他字段。例如,第2列对第5列进行了条件检查,如果第5列有值,则第2列也必须有值

我已经用VB和Python实现了这一点。问题是这个逻辑在应用程序中是硬编码的。我想要的是将这些规则移动到一个XML中,应用程序将在其中读取该XML并处理该文件。如果处理规则发生了变化——并且经常发生变化——那么应用程序保持不变,只有XML发生了变化

以下是python中的两个示例规则:

样本一

current_column_data = 5 #data from the current position in the CSV
if validate_data_type(current_column_data, expected_data_type) == False:
    return error_message
index_to_check_against = 10 #Column against which there is a "logical" test
text_to_check = get_text(index_to_check_against)
if validate_data_type(text_to_check, expected_data_type) == False:
    return error_message
if current_column_data > 10:    #This test could be checking String Vs String so have to keep in mind that to avoid errors since current column data could be a string value
    if text_to_check <= 0:
        return "Text to check should be greater than 0 if current column data is greater than 10 "
注意:对于CSV中的每一列,我们已经知道预期的数据类型、该字段的预期长度,无论是必填、可选还是有条件的,如果是有条件的,则知道条件所基于的另一列

现在我只需要一些关于如何在XML中实现的指导,应用程序读取XML并知道如何处理每个列

有人在别处提出了以下示例,但我仍然无法理解这个概念:

<check left="" right="9" operation="GTE" value="3" error_message="logical failure for something" /> 
#Meaning: Column 9 should be "GTE" i.e. Greater than or equal two value 3"

#含义:第9列应为“GTE”,即大于或等于两个值3”
有没有一种不同的方法来实现这种逻辑,或者甚至是一种方法来改进我这里的东西


建议和指针受欢迎

此概念称为领域特定语言(DSL)-您正在有效地创建一种用于验证CSV文件的小型编程语言。DSL允许您简洁地表达有效CSV文件的规则

此DSL可以使用XML表示,或者另一种方法是用python开发函数库。然后,您的DSL可以表示为一个小型python程序,它是这些函数的一个序列。此方法称为in语言或“internal”“DSL——它的好处是您可以在自己的语言中使用python的全部功能

看看你的样品,你已经非常接近了。当我阅读它们时,它们几乎就像CSV验证规则的英文描述

不要觉得必须走XML路线——将所有内容都保存在Python中没有错

  • 您可以拆分代码,这样您就有了一个python文件,其中包含DSL中表示的“CSV验证规则”,您需要经常更新/重新分发该文件,以及定义DSL函数的单独文件,这些文件的更改频率较低
  • 在某些情况下,甚至可以将DSL开发到非程序员可以更新/维护其中编写的“程序”的程度

您正在解决的问题不一定是以XML为边界的。好的,您可以使用XSD对XML进行验证,但这意味着您的数据需要是XML,我不确定您是否能够做到“如果A>3,则遵循规则”

与Ross answers相比,有一种不那么优雅但可能更简单的方法,就是简单地将规则集定义为数据,并使用特定的函数处理它们,这基本上就是XML示例所做的,使用XML存储(即序列化)数据——但您可以使用任何其他序列化格式,如JSON、YAML、INI甚至CSV(这并不可取)

因此,您可以将注意力集中在规则的数据模型上


首先,标题听起来很吓人:你不想在数据文件中做逻辑。这是规则#1。呵呵。好吧。我已经改变了它。希望它现在不那么吓人。哦,谢谢,妖怪消失了!这将是一种“外部DSL”方法,和我的答案一样有效。(我喜欢这个XML结构,比问题中的示例更好,它更“自我文档化”更容易理解。)不,我不必走XML路线。这只是我首先想到的。到目前为止,分割文件是我想到的,但我想要XML格式,以便非python程序员可以在验证引擎每次更改时更新它
<check left="" right="9" operation="GTE" value="3" error_message="logical failure for something" /> 
#Meaning: Column 9 should be "GTE" i.e. Greater than or equal two value 3"
<cond name="some explanatory name">
    <if><expr>...</expr>
    <and>
        <expr>
            <left><column>9</column></left>
            <op>ge</op>
            <right>3</right>
        </expr>
        <expr>
            <left><column>1</column></left>
            <op>true</op>
            <right></right>
        </expr>
    </and>
</cond>