当前位置: 首页 > 知识库问答 >
问题:

希望在使用JAXB验证XML时获得所有错误列表

林元明
2023-03-14

当我使用JAXB验证XML文件时,您能帮我获取所有错误的列表吗?

现在我已经实现了同样的代码。我已经通过对XML文件进行解组来实现代码。

如果XML文件中有任何错误,那么当我在当时解组XML文件时,我得到了异常,但在给出第一个异常后出现了异常,但我想要该XML文件所有错误的列表。这不应该在出现第一个错误后出现。

Source xsdFileName = new StreamSource(new File("validate6.xsd"));
    Source xmlFileName = new StreamSource(new File("test3.xml"));

    try {
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = sf.newSchema(xsdFileName);

        JAXBContext jc = JAXBContext.newInstance(Innovations.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setSchema(schema);
        unmarshaller.setEventHandler(new MyValidationEventHandler());
        Innovations innovation = (Innovations) unmarshaller.unmarshal(xmlFileName);

        System.out.println("Total Size :: " + innovation.getInnovationList().size());
        System.out.println(xmlFileName.getSystemId() + " is valid");
    } catch (JAXBException e) {
        e.printStackTrace();
        System.out.println(xmlFileName.getSystemId() + " is NOT valid");
    } catch (SAXParseException e) {
        e.printStackTrace();
        System.out.println(xmlFileName.getSystemId() + " is NOT valid");
    } catch (SAXException e) {
        e.printStackTrace();
        System.out.println(xmlFileName.getSystemId() + " is NOT valid");
    }

XSD文件:

<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="innovations">
    <xs:complexType>
        <xs:sequence>
            <xs:element type="xs:string" name="organization" />
            <xs:element name="innovation" maxOccurs="unbounded"
                minOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="title" minOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1" />
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="brief_description" minOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1" />
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="categories" minOccurs="1">
                            <xs:complexType mixed="true">
                                <xs:sequence>
                                    <xs:element name="category" maxOccurs="unbounded"
                                        minOccurs="1">
                                        <xs:simpleType>
                                            <xs:restriction base="xs:string">
                                                <xs:minLength value="1" />
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="tags" minOccurs="1">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="tag" maxOccurs="unbounded"
                                        minOccurs="1">
                                        <xs:simpleType>
                                            <xs:restriction base="xs:string">
                                                <xs:minLength value="1" />
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="full_description" minOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1" />
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="patent_number" maxOccurs="unbounded" minOccurs="0">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1" />
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="patent_status" maxOccurs="unbounded" minOccurs="0">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1" />
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="case_manager" minOccurs="1">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="xs:string">
                                        <xs:attribute type="xs:string" name="first_name"
                                            use="optional" />
                                        <xs:attribute type="xs:string" name="last_name"
                                            use="optional" />
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="status" minOccurs="1">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:minLength value="1" />
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                    <xs:attribute type="xs:short" name="file_number" use="required" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

验证事件处理程序类

public class MyValidationEventHandler implements ValidationEventHandler {

public boolean handleEvent(ValidationEvent event) {
    System.out.println("\nEVENT");
    switch (event.getSeverity()) {
    case 0:
        System.out.println("SEVERITY:  WARNING");
        break;
    case 1:
        System.out.println("SEVERITY:  ERROR");
        break;
    case 2:
        System.out.println("SEVERITY:  FATAL_ERROR");
        break;
    }
    System.out.println("MESSAGE:  " + event.getMessage());
    System.out.println("LINKED EXCEPTION:  " + event.getLinkedException());
    System.out.println("LOCATOR");
    System.out.println("    LINE NUMBER:  " + event.getLocator().getLineNumber());
    System.out.println("    COLUMN NUMBER:  " + event.getLocator().getColumnNumber());
    System.out.println("    OFFSET:  " + event.getLocator().getOffset());
    System.out.println("    OBJECT:  " + event.getLocator().getObject());
    System.out.println("    NODE:  " + event.getLocator().getNode());
    System.out.println("    URL:  " + event.getLocator().getURL());
    return true;
}

}

事件严重性:FATAL\u错误消息:cvc复杂类型。2.4.a: 发现以元素“case\u manager1”开头的无效内容。应为“{patent\u status,case\u manager}”之一。链接异常:组织。xml。萨克斯。SAXParseException;systemId:文件:/D:/AHWeb2.0.3/test3。xml;行号:24;列数:55;cvc复合型。2.4.a: 发现以元素“case\u manager1”开头的无效内容。应为“{patent\u status,case\u manager}”之一。定位器行号:24列号:55偏移量:-1对象:null节点:null URL:文件:/D:/AHWeb2.0.3/test3。xml

事件严重性:错误消息:意外元素(uri:"",local:"case_manager1")。预期的元素是

事件严重性:FATAL\u错误消息:元素类型“case\u manager1”必须由匹配的结束标记“”终止。链接异常:组织。xml。萨克斯。SAXParseException;systemId:文件:/D:/AHWeb2.0.3/test3。xml;行号:25;列数:5;元素类型“case\u manager1”必须由匹配的结束标记“”终止。定位器行号:25列号:5偏移量:-1对象:null节点:null URL:文件:/D:/AHWeb2.0.3/test3。xml文件:/D:/AHWeb2.0.3/test3。xml不是有效的javax。xml。绑定UnmarshaleException-带链接异常:[org.xml.sax.SAXParseException;systemId:file:/D:/AHWeb2.0.3/test3.xml;行号:25;列号:5;元素类型“case\u manager1”必须由匹配的结束标记终止]在javax。xml。绑定助手。AbstractUnmarshallerImpl。com上的CreateUnmarshaleException(未知源)。太阳xml。绑定v2.runtime。解组器。解组签名模板。com上的createUnmarshaleException(UnmarshallerImpl.java:514)。太阳xml。绑定v2.runtime。解组器。解组签名模板。com上的unmarshal0(UnmarshallerImpl.java:215)。太阳xml。绑定v2.runtime。解组器。解组签名模板。javax上的unmarshal(UnmarshallerImpl.java:184)。xml。绑定助手。AbstractUnmarshallerImpl。在javax上解组(未知源)。xml。绑定助手。AbstractUnmarshallerImpl。在com上解组(未知源)。测验创造验证。InnovationUnmarshalDemo。main(innovationnmarshaldemo.java:34)由:org引起。xml。萨克斯。SAXParseException;systemId:文件:/D:/AHWeb2.0.3/test3。xml;行号:25;列数:5;元素类型“case\u manager1”必须由匹配的结束标记“”终止。位于组织。阿帕奇。xerces。解析器。AbstractSAXParser。在组织解析(未知源)。阿帕奇。xerces。jaxp。SAXParserImpl$JAXPSAXParser。在com上解析(未知源)。太阳xml。绑定v2.runtime。解组器。解组签名模板。解组0(UnmarshallerImpl.java:211)。。。4个以上

谢谢。

共有2个答案

平学
2023-03-14

好吧,问题就在这里:

/test3.xml is NOT valid javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException; systemId: file:/D:/AHWeb2.0.3/test3.xml; lineNumber: 25; columnNumber: 5; The element type "case_manager1" must be terminated by the matching end-tag "".] at javax.xml.bind.helpers.AbstractUnmarshallerI mpl.createUnmarshalException(Unknown Source) at...

XML的第25行不正确-缺少结束标记。

由于XML语法不正确,此架构验证机制无法继续传递严重错误。

利永年
2023-03-14

我想定制验证器可以帮助您:

public class MyValidationEventHandler implements ValidationEventHandler{

    public boolean handleEvent(ValidationEvent ve) {            
        if (ve.getSeverity()==ve.FATAL_ERROR ||  
                ve .getSeverity()==ve.ERROR){
            ValidationEventLocator  locator = ve.getLocator();
            //print message from valdation event
            System.out.println("Message is " + ve.getMessage());
            //output line and column number
            System.out.println("Column is " + 
                    locator.getColumnNumber() + 
                    " at line number " + locator.getLineNumber());
        }
        return true;
    }

}

然后

setEventHandler(new MyValidationEventHandler()); 
 类似资料:
  • 类定义为: 要加载的xml示例部分: 我创建了一个验证收集器,以显示针对架构解封xml文件过程中所有验证错误,但结果令人困惑:验证收集器将继承我的RemoteHost的每个类的验证错误显示为: 元素“host firstsubtype”不能有字符或元素信息项[children],因为该类型的内容类型为空。 元素“Other HostType”必须没有字符或元素信息项[childrens],因为该类

  • 问题内容: 我尝试使用Jaxb在变量中获取验证消息。从此处尝试示例http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/api/javax/xml/bind/Unmarshaller.html 我的代码: 但是什么也没发生。我究竟做错了什么 ? 问题答案: 以下内容应有所帮助: JAXB2ValidationEve

  • 我有一个Spring Boot应用程序,它使用来自WSO2身份服务器的OAuth2身份验证。当我在Spring Tool Suit上运行aplication时,它起作用了,所以我可以在其中唱歌并使用我的网站。但是当我在Tomcat(9.0)上运行我的应用程序时,我尝试访问一个页面,并重定向到登录页面,当我尝试登录时,我得到错误ERR_TOO_MANY_REDIRECTS 错误示例:当我的sprin

  • 编辑:感谢Preetam Kumar,这个问题已经解决,但错误现在在其他地方。当我再次尝试解组我的xml文件时,我收到这个错误,告诉我找不到元素: 然而,我给了xml文件到模式的正确路径,但是它似乎没有使用它...我不明白。 注意:我知道模式和xml标记在下面的示例中不完全匹配,我已经在我的文件中纠正了它。 最近,我不得不使用JAXB java库将一些XML文件解析为java对象。 我制作了一个X

  • 问题内容: 我有工作,并为我解编和编组XML转换为Java对象,反之亦然。现在,我试图根据我们的模式(test.xsd)来验证我们的XML。假设我的XML中缺少任何必填字段,那么我想根据模式test.xsd验证XML后知道哪个字段缺失。 如何根据test.xsd模式验证XML。我的test.xsd模式路径是- C:\ workspace \一\二\三\ src \ main \ java \ co

  • 现在,我正在使用XSD进行XML验证。 由于我使用了SchemaFactory: 然后我尝试切换到apache xerces,得到这个错误(从导入xerces开始): 为什么在android studio中java.exe以值1退出