我会创建另一个包含规则集的XML。
在规则中,如果您只需要确保层次结构有效并且必须包含某种数据类型,那么我会制作一个“规则”XML,它是完全有效的XML的完整层次结构,包含里面的代码与每一个可能有效孩子的和属性,其中也包含了所需的数据类型为字符串值的所有节点,例如
<age>"int"</age>
,您可以通过层次读和组成树状结构,它可以很容易地验证层次结构。
如果有更详细的规则,例如如果某个节点是强制性的,并且如果失踪则认为无效,您可以设置一个属性,如“isMandatory”,在构建树时可以读取该属性,并执行检查某个XML节点是否包含强制子节点!
这将是一个动态的方法,因为您所要做的只是编辑规则XML,并且您的代码可以完美扩展以适应未来的规则。
我以前亲自使用过这个方法,当我需要确保层次结构正确并且节点包含正确的属性时,除非看到您有大量规则,否则您可能需要不同的结构。
编辑: 我会使用DOM解析器来解析XML。 DOM解析模型被认为是内存效率低下的问题,但对于您的情况而言,在执行方面将非常有效。 http://howtodoinjava.com/2014/07/31/java-xml-dom-parser-example-tutorial/#parse_known_xml 您可以在Oracle网站上阅读更多关于DOM解析器API的信息。
其次,您可以根据自己的设置验证方法来获得创意。这可以用于你的例子非常简单的验证XML是:
进行验证
<DATA>
<Parent isRequired="true">
<Fields>
<Name isRequired="true">
<Type>string</Type>
</Name>
<Age isRequired="false">
//Cannot have more than one age field
<Rules>
<MaxCount>1</MaxCount>
</Rules>
</Age>
// etc etc for other fields
<Rules>
//Having name and an age throws error
<Rule>Name + Age</Rule>
//Throw error if there is a height element together with an age or a bloodtype
<Rule>(Age | Bloodtype) + Height</Rule>
</Rules>
</Fields>
</Parent>
</DATA>
方法是从(规则XML)根节点开始,并期待所有的孩子的。确保数据XML中存在所有强制节点。确保所有叶节点数据类型都正确。
将所有节点解析为一个字符串,并以类似的方式解决带注释的int表达式,确保孩子遵循规则表达式。
您不需要使用相同的示例格式,和+。要富有创造性,弄清楚什么“规则表达”最适合你:)
整体来说,你可能有很多不同的“规则类型”规则。例如,一个规则可能需要一个必须拥有的节点,而一个规则可能确保某个节点不存在(如果另一个节点不存在),并且一个规则可能是某个节点不能存在多次。 为了支持如此多的不同类型,如果验证,结构可能最终变得复杂,但如果您需要真正的动态规则(最终也可以重复使用),那么肯定会付出努力。
来源
2015-03-25 05:08:03
JTY
感谢您的回复。当前的规则被列为“如果节点1 = xyz并且节点2 = lmn然后抛出错误(节点1和2是在Excel中的标签名称)”,在某些情况下它可以具有5个不同的元素和/或条件。目前我有三个问题1.如何将规则存储在xml文件中,我的意思是结构2.如何解析xml(源)3.如何将规则转换为xml标签名称,因为UI字段名称和xml标签名字是不同的 – 2015-03-25 08:37:38
@DougParker看看编辑过的答案,看它是否回答你的问题。 – JTY 2015-03-25 09:46:39