XSD 验证捕获每个 complexType 中的所有错误 elemnt - 无法捕获所有错误

XSD Validation Catching ALL Errors within each complexType elemnt - FAILS to catch all

提问人:shibendra chakraborty 提问时间:5/28/2023 最后编辑:marc_sshibendra chakraborty 更新时间:7/30/2023 访问量:35

问:

我的目标是在 XSD 验证中捕获 JAVA 中每个“complexType”的所有错误 - 但是当 xml 在 complexType 元素下有多个错误时,它就会失败。

我正在使用来自 -https://www.baeldung.com/java-validate-xml-xsd

使用的 XSD -

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="individual">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string" />
                <xs:element name="address">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="zip" type="xs:positiveInteger" />
                            <xs:element name="city" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

XML 在引入错误时使用 -

<?xml version="1.0" encoding="UTF-8" ?>
<individual>
    <name>Baeldung</name>
    <age></age> <!-- error1 -->
    <salary></salary> <!-- error2 -->
    <address>
        <zip>00001</zip>
        <state></state> <!-- error3 -->
        <city>New York</city>
        <country></country> <!-- error4 -->
    </address>
</individual>

java代码从上面的链接中实现了ErrorHandler。

public class XmlErrorHandler implements ErrorHandler ....

现在,正如我们所看到的,在 XML 中,有 4 个新元素位于 2 个 complexType 下。验证列表报告每个报告只有一个来自 complexTypes 的错误。它无法在 ErrorHandler 实现中捕获所有内容。

来自 Errorhandler 实现的列表 - 4 个错误中只有 2 个错误!

cvc-complex-type.2.4.a:发现以元素“age”开头的无效内容。应为“{address}”之一。

cvc-complex-type.2.4.a:发现以元素“state”开头的无效内容。“{city}”之一应为预期。

谁能帮我?如何修复每个complexType的所有错误?

谢谢。

Java XML 验证 XSD ComplexType

评论


答:

1赞 Michael Kay 5/28/2023 #1

在根据语法解析内容时,从错误中恢复是一门困难的艺术。与解析 Java 进行比较。给定输入,如

String s := "10" - 3f4 ;

有多少错误?也许“-”应该是“+”?也许没有引号的“10”应该是 10?也许“3f4”应该是“3e4”,或者应该是“3+4”?这就像火柴棒拼图:从错误的排列到有效的排列,你必须移动的火柴棒的最小数量是多少?您可以将这些移动中的每一个都视为错误,并且可以要求处理器报告将写入的内容转换为有效内容所需的最少更改次数。但解析器通常没有那么聪明,人们也不期望它们如此。解析器报告他们看到的第一件事不是有效的延续(这里是“-”号),然后他们向前跳到一个可以合理地确定他们知道自己在哪里的点——在 Java 中,这通常是分号。如果不这样做,则可能会报告虚假错误,因为您猜错了第一个错误的真实性质,并且用户会感到沮丧,因为后续错误毫无意义。