どのようにjavaでXML schemaを検証しますか?
3437 ワード
以前はXMLを検証してdtdを使っていましたが、今日はxsdで検証してみましたが、ネット上の例はなかなか実行できませんでした.長い間苦労しましたが、例の中にXMLファイルの名前空間がはっきり設定されていません.ここでソリューション記録を解決します.
[note.xml]
ネット上の例はここでxmlnsに対して設定していません.ここのxmlnsは必ず以下のnote.xsdの中のtarget Namespaceとxmlnsと一致しています.
[note.xsd]
[java]
[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);