【问题标题】:Getting two XML validation events for one error为一个错误获取两个 XML 验证事件
【发布时间】:2015-07-04 02:22:41
【问题描述】:

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

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

我正在尝试生成报告以供客户查看和/或纠正错误,但我不想两次报告相同的错误。

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

【问题讨论】:

    标签: java xml jaxb sax xml-validation


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答 - 您能推荐其他处理器或技术吗?
    • Java 世界中显而易见的替代 XSD 处理器是我自己的 Saxon 产品。但是您几乎肯定会发现它的错误报告的某些方面更好,而另一些方面则更差(嗯,这在一定程度上是口味问题。)
    • 谢谢 - 让我们看看我们的错误报告口味是否兼容:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2022-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    相关资源
    最近更新 更多