我一直在尝试编写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有效性,包括额外的结束标记
,请告诉我答案 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
的答案。