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

Java 为一个错误获取两个XML验证事件,java,xml,jaxb,sax,xml-validation,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=n

我正在尝试验证一个有错误的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>

G
我必须做些什么才能知道这两个事件是相关的,这样我就可以故意忽略其中一个事件,或者更好的是,这两个事件中只有一个

我正在尝试生成一个报告供客户端查看和/或更正错误,我不想报告同一错误两次


如果有其他方法可以做到这一点,我也愿意这样做。

模式处理器的错误报告永远不会是理想的,而且您几乎没有机会改进它,除非可能通过过滤和轻微的重新格式化。您可以尝试使用不同的模式处理器,看看它的消息是否更符合您的口味,但总会出现这样的异常。这个处理程序可能是有点逐字逐句地要求报告规范中哪些条款被违反了;通常不止一个。或者,经常发生的情况是,在验证器中,不同级别的软件提供不同的信息,通常最容易在一个级别告诉您(比如)发现日期无效,在更高的层次上,该日期出现在您的源代码中。

感谢您的回答-您能推荐另一种处理器或技术吗?Java世界中显而易见的替代XSD处理器是我自己的Saxon产品。但您几乎肯定会发现它的错误报告的某些方面更好,而另一些方面更差(好吧,这在一定程度上是一个品味问题。)谢谢-让我们看看我们的错误报告品味是否兼容:)