需要验证xml - 需要帮助

时间:2015-03-25 04:47:42

标签: java xml functional-programming

我有一个xml文件,其数据需要使用250多个规则进行验证,xml的大小可以在4MB到50 MB之间。有以下问题。

  1. 应该定义规则,因为我希望它们能够动态控制(而不是硬编码)
  2. 鉴于数据和输入的大小是xml,我应该如何处理这个问题(考虑到规则可能会改变等) 3. UI和XML标签名称的名称将不同,因此应何时进行翻译
  3. 以下是xml的结构

    <DATA>
    <Parent>
         <Fields>
         //All the data like name, age, height, weight, blood group etc goes here
         </Fields>
         <Childs>
         <Name = 'Andrew' id = 7560>
         .......
         </Childs>
         <Relatives>
         //Relationships
         </Relatives>
    </Parent>
         <Children> //For each children it list their details
           //All the data like name, age, height, weight, blood group etc goes here
         </Children>
         <Relationships>//For each relationship it list their details
         </Relationship>
    </Data>
    

    感谢

1 个答案:

答案 0 :(得分:0)

我会创建另一个包含规则集的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中存在所有必需节点。确保所有叶节点数据类型都正确。

将所有节点解析为字符串,并以类似于解决infix标记的int表达式的方式,确保子节点遵循规则表达式。

使用|不需要使用相同的示例格式和+。要有创意并弄清楚“规则表达”最适合你:)

重点是,您可能拥有许多不同的“类型”规则。例如,一个规则可能需要一个必须拥有的节点,而一个规则可能确保某个节点不存在(如果另一个节点存在),并且一个规则可能是某个节点不能存在多次。 为了支持如此多的不同类型(如果验证),结构可能最终变得复杂,但如果您需要真正的动态规则(这可能最终也可以重复使用),肯定值得付出努力。