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_ERROR メッセージ: cvc-complex-type.2.4.a: 要素「case_manager1」で始まる無効なコンテンツが見つかりました。「{patent_status, case_manager}」のいずれかが必要です。リンクされた例外: org.xml.sax.SAXParseException; systemId: ファイル:/D:/AHWeb2.0.3/test3.xml; 行番号: 24; 列番号: 55; cvc-complex-type.2.4.a: 要素「case_manager1」で始まる無効なコンテンツが見つかりました。「{patent_status, case_manager}」のいずれかが必要です。ロケーター行番号: 24 列番号: 55 オフセット: -1 オブジェクト: null ノード: null URL: ファイル:/D:/AHWeb2.0.3/test3.xml
イベント重大度: エラー メッセージ: 予期しない要素 (uri:""、local:"case_manager1")。期待される要素は、<{}tags>、<{}title>、<{}patent_number>、<{}brief_description>、<{}status>、<{}full_description>、<{}categories>、<{}case_manager> です。 ,<{}patent_status> LINKED EXCEPTION: null LOCATOR LINE NUMBER: 24 COLUMN NUMBER: 55 OFFSET: -1 OBJECT: null NODE: null URL: file:/D:/AHWeb2.0.3/test3.xml
イベント重大度: FATAL_ERROR メッセージ: 要素タイプ「case_manager1」は、一致する終了タグ「」で終了する必要があります。リンクされた例外: org.xml.sax.SAXParseException; systemId: ファイル:/D:/AHWeb2.0.3/test3.xml; 行番号: 25; 列番号: 5; 要素タイプ「case_manager1」は、一致する終了タグ「」で終了する必要があります。ロケーター行番号: 25 列番号: 5 オフセット: -1 オブジェクト: null ノード: null URL: ファイル:/D:/AHWeb2.0.3/test3.xml ファイル:/D:/AHWeb2.0.3/test3.xml は無効ですjavax.xml.bind.UnmarshalException - リンクされた例外あり: [org.xml.sax.SAXParseException; systemId: ファイル:/D:/AHWeb2.0.3/test3.xml; 行番号: 25; 列番号: 5; 要素タイプ「case_manager1」は、一致する終了タグ「」で終了する必要があります。] javax.xml.bind.helpers. com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:514) の AbstractUnmarshallerImpl.createUnmarshalException (不明なソース) com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0 (UnmarshallerImpl.java:215) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal (Unknown Source) at javax .xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(不明なソース) com.test.innovation.validation.InnovationUnmarshalDemo.main(InnovationUnmarshalDemo.java:34) の原因: org.xml.sax.SAXParseException; systemId: ファイル:/D:/AHWeb2.0.3/test3.xml; 行番号: 25; 列番号: 5; 要素タイプ「case_manager1」は、一致する終了タグ「」で終了する必要があります
ありがとう。