Java 根据XML验证多个XSD
我目前正在努力解决编写一些单元测试来检查XSD是否对示例XML文件有效的问题。我发现以下错误:Java 根据XML验证多个XSD,java,xml,xsd,validation,Java,Xml,Xsd,Validation,我目前正在努力解决编写一些单元测试来检查XSD是否对示例XML文件有效的问题。我发现以下错误: org.xml.sax.SAXParseException;cvc elt.1:找不到元素“VMS”的声明。 位于com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) 位于com.sun.org.apache.xerces.int
org.xml.sax.SAXParseException;cvc elt.1:找不到元素“VMS”的声明。
位于com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
位于com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
位于com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437)
请访问com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
位于com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325)
位于com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handlestarelement(XMLSchemaValidator.java:1906)
位于com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:746)
位于com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.beginNode(DOMValidatorHelper.java:277)
位于com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:244)
位于com.sun.org.apache.xerces.internal.jaxp.validation.DOMValidatorHelper.validate(DOMValidatorHelper.java:190)
位于com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:109)
我的XSD文件:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Messages header -->
<xs:complexType name="VMS_TYPE">
<!-- Recipient of message -->
<xs:attribute name="TO" type="xs:string"/>
<!-- Sender of message -->
<xs:attribute name="FR" type="xs:string" />
<!-- Message identification number consists -->
<xs:attribute name="VN" type="xs:string" />
<!-- Message creation date -->
<xs:attribute name="OD" type="xs:date" />
<!-- Message creation time -->
<xs:attribute name="OT" type="xs:string" />
<!-- Mean of communication to sender of message -->
<xs:attribute name="MTO" type="xs:string" />
<!-- Mean of communication to recipient of message -->
<xs:attribute name="MFR" type="xs:string" />
<!-- TODO - explain attribute meaning -->
<xs:attribute name="MD" type="xs:string" />
</xs:complexType>
</xs:schema>
第二
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="vms_header.xsd" />
<!-- Alarm message -->
<xs:complexType name="ALR_TYPE" >
<xs:complexContent>
<xs:extension base="VMS_TYPE">
<xs:sequence>
<xs:element name="ALR" type="ALR_BODY_TYPE" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ALR_BODY_TYPE">
<xs:attribute name="BAT" type="xs:int"/>
<xs:attribute name="TEM" type="xs:int"/>
<xs:attribute name="GPS" type="xs:int"/>
<xs:attribute name="SOS" type="xs:int"/>
<xs:attribute name="CV" type="xs:int"/>
<xs:attribute name="MOD" type="xs:int"/>
<xs:attribute name="FGPS" type="xs:int"/>
<xs:attribute name="FBAT" type="xs:int"/>
<xs:attribute name="FALM" type="xs:int"/>
<xs:attribute name="FSOS" type="xs:int"/>
<xs:attribute name="FFW" type="xs:int"/>
<xs:attribute name="ASOS" type="xs:int"/>
</xs:complexType>
</xs:schema>
第三
和我的XML示例文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VMS TO="CV0001" FR="CAR001" VN="CAR001201406040001" OD="2014-06-04" OT="12:14" MD="+3465104505050">
<ALR BAT="0" TEM="0" GPS="0" SOS="0" CV="0" MOD="0" FGPS="0" FBAT="0" FALM="0" FSOS="0" FFW="0" ASOS="0"/>
</VMS>
这对我很有用,jdk1.8.0\u 20
./third.xsd # probably not the real name, but you no tell
./types/alr_msg_type.xsd
./types/vms_header.xsd
public static void main( String[] args ) throws Exception {
Handler handler = new Handler();
DocumentBuilder parser =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
parser.setErrorHandler( handler );
try {
Document document = parser.parse(new File("x.xml"));
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File("third.xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.setErrorHandler( handler );
// validate the DOM tree
try {
validator.validate(new DOMSource(document));
} catch (SAXException e) {
// ...
System.out.println( "VAlidation error" );
}
} catch (SAXParseException e) {
// syntax error in XML document
System.out.println( "Syntax error" );
}
}
我使用了以下代码(使用JDK1.8.0_11):
结果是:
语法错误
org.xml.sax.SAXParseException;行号:6;栏目号:45;src resolve:无法将名称“ALR_TYPE”解析为(n)“TYPE definition”组件
./third.xsd # probably not the real name, but you no tell
./types/alr_msg_type.xsd
./types/vms_header.xsd
public static void main( String[] args ) throws Exception {
Handler handler = new Handler();
DocumentBuilder parser =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
parser.setErrorHandler( handler );
try {
Document document = parser.parse(new File("x.xml"));
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File("third.xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.setErrorHandler( handler );
// validate the DOM tree
try {
validator.validate(new DOMSource(document));
} catch (SAXException e) {
// ...
System.out.println( "VAlidation error" );
}
} catch (SAXParseException e) {
// syntax error in XML document
System.out.println( "Syntax error" );
}
}
DefaultHandler handler = new DefaultHandler();
DocumentBuilder parser =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
parser.setErrorHandler( handler );
try {
Document document = parser.parse(getClass().getResourceAsStream("x.xml"));
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(getClass().getResourceAsStream("third.xsd"));
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.setErrorHandler( handler );
// validate the DOM tree
try {
validator.validate(new DOMSource(document));
} catch (SAXException e) {
// ...
System.out.println( "Validation error" );
}
} catch (SAXParseException e) {
// syntax error in XML document
System.out.println( "Syntax error");
System.out.println(e);
}