Python 如何定义应用程序';XML文件中的验证规则
我有一个应用程序,它根据一些设置的规则验证CSV文件。应用程序检查CVS中的某些“列/字段”是否标记为必填,其他应用程序检查其必填状态是否基于其他字段。例如,第2列对第5列进行了条件检查,如果第5列有值,则第2列也必须有值 我已经用VB和Python实现了这一点。问题是这个逻辑在应用程序中是硬编码的。我想要的是将这些规则移动到一个XML中,应用程序将在其中读取该XML并处理该文件。如果处理规则发生了变化——并且经常发生变化——那么应用程序保持不变,只有XML发生了变化 以下是python中的两个示例规则: 样本一Python 如何定义应用程序';XML文件中的验证规则,python,xml,vb.net,Python,Xml,Vb.net,我有一个应用程序,它根据一些设置的规则验证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开发到非程序员可以更新/维护其中编写的“程序”的程度
首先,标题听起来很吓人:你不想在数据文件中做逻辑。这是规则#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>