XML Schema
Java
JAXB Java Architecture for XML Binding
Javaオブジェクト⇔XML Schema
JDKツール:
xjc XML Schema⇒クラスコード
schemagen アノテーション付きのクラスコード⇒XML Schema
XML Schema型とJavaデータ型のマッピング
★XML Schema応用例
String xmlString = "<item><description>aaa</description><price>100.0</price><quantity>2</quantity></item>";
//文字列の場合
InputSource xmlStream = new InputSource(new StringReader(xmlString));
//ファイルの場合
InputStream xmlStream2 = new FileInputStream("file/target.xml");
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
DefaultHandler defHandler = new DefaultHandler() {
@Override
public void warning(SAXParseException e) throws SAXException {
System.out.println("Enter warning");
throw e;
}
@Override
public void error(SAXParseException e) throws SAXException {
System.out.println("Enter error");
throw e;
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
System.out.println("Enter fatalError");
throw e;
}
};
StreamSource ss = new StreamSource(new File("file/schema.xsd"));
try {
Schema schema = sf.newSchema(ss);
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setSchema(schema);
SAXParser saxParser = spf.newSAXParser();
//★Entity Resolverを設定しない場合
//saxParser.parse(xmlStream, defHandler); //方式1
saxParser.parse(xmlStream2, defHandler); //方式2
//★Entity Resolverを設定する場合
XMLReader reader = saxParser.getXMLReader();
reader.setEntityResolver(new CustomResolver());
reader.setContentHandler(defHandler);
//reader.parse(xmlStream); //方式1
InputSource is = new InputSource(xmlStream2);
reader.parse(is); //方式2
//...
} catch (SAXException e) {
e.printStackTrace();
throw new IOException("aaa", e);
} catch (IOException e) {
e.printStackTrace();
throw new IOException("bbb", e);
} catch (ParserConfigurationException e) {
e.printStackTrace();
throw new IOException("ccc", e);
}
class CustomResolver implements EntityResolver {
@Override
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
String entityPath = "file:file/temp";
if(systemId.equals(entityPath)) {
System.out.println(publicId + " " + systemId);
return new InputSource(entityPath);
}
return new InputSource();
}
}
schema.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="item">
<xs:complexType>
<xs:sequence>
<xs:element name="description" type="xs:string"></xs:element>
<xs:element name="price" type="xs:decimal"></xs:element>
<xs:element name="quantity" type="xs:integer"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
target.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE item SYSTEM "file:file/temp">
<item>
<description>aaa</description>
<price>100.0</price>
<quantity>2</quantity>
</item>
.NET系
ツール:
xsd.exe
XML ⇒ XSD
XSD ⇒ DataSet
XSD ⇒クラス
クラス⇒ XSD