为一个错误获取两个XML验证事件

时间:2015-07-04 02:22:41

标签: java xml jaxb sax xml-validation

我正在尝试验证有错误的XML文件,但是此错误以两种不同的格式报告。我只想要一个事件,我更喜欢哪种格式。

以下是我所看到的:

[severity=FATAL_ERROR,message=cvc-enumeration-valid: Value 'G' is not facet-valid with respect to enumeration '[M, F]'. It must be a value from the enumeration.,locator=[node=null,object=null,url=null,line=-1,col=-1,offset=-1]]
[severity=FATAL_ERROR,message=cvc-type.3.1.3: The value 'G' of element 'Gender' is not valid.,locator=[node=null,object=null,url=null,line=-1,col=-1,offset=-1]]

我更喜欢第二种格式,因为它会报告元素。

目前我正在使用ValidationEventHandler来简单地打印事件:

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;

public class MessageValidationEventHandler implements ValidationEventHandler 
{
    @Override
    public boolean handleEvent(ValidationEvent ve) 
    {
        System.out.println(ve);

        return true;
    }
}

XSD文件(简化)如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="Message">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Gender" type="STGenderCode" minOccurs="0"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="STGenderCode">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="M"/>
            <xsd:enumeration value="F"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

使用此XML:

<?xml version="1.0" encoding="utf-8"?>
<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="NexusMessage.xsd">
      <Gender>G</Gender>
</Message>

要知道这两个事件是相关的,我必须做什么才能有意忽略一个 - 或者 - 更好但只有两个事件中的一个。

我正在尝试为客户生成一个报告来查看和纠正错误,我不想两次报告相同的错误。

如果还有其他方法可以做到这一点,我也会对此持开放态度。

1 个答案:

答案 0 :(得分:0)

来自模式处理器的错误报告永远不会是理想的,除了可能通过过滤和次要重新格式化之外,您几乎没有机会对其进行改进。您可以尝试使用不同的架构处理器来查看其消息是否更符合您的口味,但总会有像这样的异常。这个处理器可能需要一点点来报告规范中的哪些条款被破坏;通常有不止一个。或者,经常发生的是在验证器内,在软件的不同级别提供不同的信息,并且通常最容易在一个级别告诉您(比方说)发现日期无效,并且在更高级别日期出现在您的来源中。