Java中的XML验证 - 额外结束标记>

时间:2014-07-23 09:23:08

标签: java xml

我一直在尝试编写junit测试用例,用于检查XML文件的语法,确保所有标记都已关闭等等。

我目前正在测试中使用dom解析器,因为它会在无效的XML上抛出异常但是当我为XML提供额外的结束标记时它不起作用 例如:如果我有

 private static final String OM_APPLICATION_STRG = "<abc>**>**\r\n" + 
            "</abc>\r\n" + 
            ""; 

而不是

private static final String OM_APPLICATION_STRG = "<abc>\r\n" + 
        "</abc>\r\n" + 
        "";    

如果有其他方法可以测试xml有效性,包括额外的结束标记

,请告诉我

3 个答案:

答案 0 :(得分:3)

&#34;额外结束标记&#34;不是一个存在的概念。它只是一个超过&#34;大于&#34; XML文件中的文本节点中的符号,并且它们完全有效。您不需要在验证器中检查它们。

例如,这是完全有效的xml:

<?xml version="1.0"?>

<xml>></xml>

答案 1 :(得分:2)

可能还有另一种方式 - SchemaFactory

您可以为xml字符串定义.xsd文件,然后使用SchemaFactory通过.xsd文件验证xml字符串。 像这个例子

   String xml = xmlFile.toString();
   try {
      URL schema = Resources.getResource("/XXX.xsd");
      Validator validator = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema").newSchema(schema)
            .newValidator();
      Source source = new StreamSource(new CharArrayReader(xml.toCharArray()));
      validator.validate(source);
   } catch (Exception e) {
      // the xml is not valid for your .xsd defination
   }

答案 2 :(得分:0)

<abc>**>**</abc>

是有效的XML。

您需要做的是为XML定义架构并在文本节点的内容上设置restrictions

一个简单的例子是schema.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="abc">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:pattern value="[\sa-zA-Z0-9\*]*" />
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>

正则表达式

[\sa-zA-Z0-9\*]*

定义元素<abc>

内的文本节点中允许的字符集

以下文件将验证

<?xml version="1.0"?>
<abc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="schema.xsd">
    hello ** world
</abc>

如果您添加>字符

hello ** > ** world

XML将不再针对架构进行验证。

要验证架构,请参阅RomanticNerd的答案。