どのようにjavaでXML schemaを検証しますか?

3437 ワード

以前はXMLを検証してdtdを使っていましたが、今日はxsdで検証してみましたが、ネット上の例はなかなか実行できませんでした.長い間苦労しましたが、例の中にXMLファイルの名前空間がはっきり設定されていません.ここでソリューション記録を解決します.
 
[note.xml]
 
<?xml version="1.0"?>
<note xmlns="http://adcoup.baidu.com/schema/note">
 <to>Tove</to>
 <from>Jani</from>
 <heading>Reminder</heading>
 <body>Don't forget me this weekend!</body>
</note>
 
  ネット上の例はここでxmlnsに対して設定していません.ここのxmlnsは必ず以下のnote.xsdの中のtarget Namespaceとxmlnsと一致しています.
 
[note.xsd]
 
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	targetNamespace="http://adcoup.baidu.com/schema/note" xmlns="http://adcoup.baidu.com/schema/note"
	elementFormDefault="qualified">
	<xs:element name="note">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="to" type="xs:string" />
				<xs:element name="from" type="xs:string" />
				<xs:element name="heading" type="xs:string" />
				<xs:element name="body" type="xs:string" />
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>
 
[java]
 
  
  String configFileLocation = "/note.xml";
        String xsdFileLocation = "/note.xsd";
        InputStream configInputStream = this.getClass().getResourceAsStream(configFileLocation);
        if (configInputStream == null) {
            throw new IllegalArgumentException("can not find resource[" + configFileLocation + "]");
        }

        InputStream xsdInputStream = this.getClass().getResourceAsStream(xsdFileLocation);
        if (xsdInputStream == null) {
            throw new IllegalArgumentException("can not find resource[" + xsdFileLocation + "]");
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = schemaFactory.newSchema(new SAXSource(new InputSource(xsdInputStream)));
        factory.setSchema(schema);

        DocumentBuilder builder = factory.newDocumentBuilder();

        builder.setErrorHandler(new ErrorHandler() {

            @Override
            public void warning(SAXParseException exception) throws SAXException {
                throw new RuntimeException(exception);
            }

            @Override
            public void fatalError(SAXParseException exception) throws SAXException {
                throw new RuntimeException(exception);
            }

            @Override
            public void error(SAXParseException exception) throws SAXException {
                throw new RuntimeException(exception);
            }
        });

        document = builder.parse(configInputStream);

        System.out.println(document);