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