Shammer's Philosophy

My private adversaria

XML Schema 定義されたXMLを解析する

次のようなXML Schemaで定義されたXML文書を解析するサンプル。
XML Schemaにしてみたものの、先日のDTDと同じ構成のものにしたつもり。
でも、間違えているところがあるかも・・・

<?xml version="1.0"?>
<schema
  xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:org="sample"
  targetNamespace="http://www.sample.com/myoriginal">
  <element name="sample">
    <complexType>
      <sequence>
        <element ref="org:elementA" minOccurs='0' maxOccurs='unbounded'/>
        <element ref="org:elementB" minOccurs='0' maxOccurs='unbounded'/>
      </sequence>
    </complexType>
  </element>
  <element name="elementA">
    <complexType>
      <element ref="org:name" minOccurs='1' maxOccurs='1'/>
    </complexType>
  </element>
  <element name="elementB">
    <complexType>
      <element ref="org:someTag" minOccurs='1' maxOccurs='1'/>
    </complexType>
    <attribute name="someAttr" type="string" use="required"/>
  </element>
  <element name="name" type="string"/>
  <element name="someTag">
    <complexType>
      <attribute name="value" type="string" use="required"/>
    </complexType>
  </element>
</schema>

上記XML Schemaで定義されるXMLは以下のようになる。

<?xml version="1.0" encoding="UTF-8"?>
<org:sample
  xmlns:org="sample"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="sample.xsd">
  <org:elementA>
    <org:name>ElementA_Name</org:name>
  </org:elementA>
  <org:elementB someAttr="B">
    <org:someTag value="someValue"/>
  </org:elementB>
</org:sample>

Javaのサンプルは以下の通り。

import org.w3c.dom.Document;
import org.apache.xerces.parsers.DOMParser;
import org.xml.sax.SAXException;
import java.io.IOException;

public class MySimpleParseWithNS {
    public static void main(String[]args){
	try {
	    DOMParser parser = new DOMParser();
	    // 妥当性検証を実行するようにParserに指示する
	    parser.setFeature("http://xml.org/sax/features/validation", true);
	    // 名前空間を使用するようにParserに指示する
	    parser.setFeature("http://xml.org/sax/features/namespaces", true);
	    parser.parse(args[0]);
	    Document doc = parser.getDocument();
	    System.out.println(args[0] + " is a valid xml.");
	}
	catch( SAXException e ){
	    System.err.println("Parser error found: " + e.getMessage());
	    System.exit(1);
	}
	catch( IOException e ){
	    System.err.println("IO error found: " + e.getMessage());
	    System.exit(1);
	}
    }
}

上記Javaサンプルで、上記XML Schemaのサンプルを解析したらエラーが出るわ出るわ・・・
一つずつ、何が原因かを探りながら直していこう。