我已经使用了生成jaxb对象的模式。我用数据填充jaxb对象然后编组它。我想在编组jaxb对象时进行模式验证。
ByteArrayOutputStream formXml = new ByteArrayOutputStream();
new JAXBElement<Form100DIV_V100>(new QName("http://example.org/types/2003/04", "Form100DIV_V100"), Form100DIVV100.class, (Form100DIVV100) form100);
if (isSchemaValidationNeeded) {
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
InputStream xsdStream = XmlUtil.class.getClassLoader().getResourceAsStream("schema/form.xsd");
StreamSource xsdSource = new StreamSource(xsdStream);
Schema schema = sf.newSchema(xsdSource);
//m.setEventHandler(new SchemaValidationEventHandler());
//m.setSchema(schema);
Validator validator = schema.newValidator();
try {
validator.validate(new StreamSource(new ByteArrayInputStream(formXml.toByteArray())));
System.out.println("File is valid");
} catch (SAXException e) {
System.out.println("File is NOT valid");
System.out.println("Reason: " + e.getLocalizedMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.org/types/2003/04" targetNamespace="http://example.org/types/2003/04"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Form100DIV_V100">
<xs:complexContent>
<xs:extension base="AbstractForm100">
<xs:sequence>
<xs:element name="AMOUNT" type="AmountType" minOccurs="0"/>
---
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
----
-----
</xs:schema>
这是我在编组后获得的xml
<Form100DIV_V100 xmlns="http://example.org/types/2003/04">
<AMOUNT>100.00</AMOUNT>
-------
---------
</Tax1099Div_V100>
虽然命名空间在xml和xsd中是正确的,但我得到了以下错误。 原因:cvc-elt.1:无法找到元素声明&#39; Form100DIV_V100&#39;。
答案 0 :(得分:1)
Form100DIV_V100
未在架构中定义为顶级元素,仅作为类型。您只需将xs:complexType
包裹在xs:element
<xs:element name="Form100DIV_V100">
<xs:complexType>
<xs:complexContent>
<xs:extension base="AbstractForm100">
<xs:sequence>
<xs:element name="AMOUNT" type="AmountType" minOccurs="0" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
在xml实例中,<Form100DIV_V100>
未正确终止。您正在使用</Tax1099Div_V100>
终止它。
<Form100DIV_V100 xmlns="http://example.org/types/2003/04">
<AMOUNT>100.00</AMOUNT>
</Form100DIV_V100>
鉴于您已正确定义AbstractForm100
和AmountType
类型且其余-----
内容正确无误,上述修复程序应验证。
此外,使用xjc进行编译时,应为您定义Form100DIVV100
,并为您的班级添加必要的@XmlRootElement
注释
@XmlRootElement(name = "Form100DIV_V100")
public class Form100DIVV100 extends AbstractForm100 {
虽然它看起来不像