- PR -

JAXPによる構文解析について

1
投稿者投稿内容
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2005-01-19 12:07
こんにちわ。みーちくと申します。
よろしくお願いいたします。

JAXPのDOMで構文解析プログラムを作成したのですが、
エラーになっているのか、エラーではないのか、判定する事ができません。
何か、方法等があるのでしょうか?
よろしくお願いいたします。

(開発環境)
WindowsXP/Eclipse3.0/jwsdp-1.5/j2sdk1.4.2_06

(Javaソース)
コード:
import java.io.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;

public class Sample {

    public static void main(String[] args) {
        try {
            // DOMパーサー用ファクトリの生成
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 妥当性検証を行う
            factory.setValidating(true);
            // 名前空間を認識する
            factory.setNamespaceAware(true);
            // XML Scehmaを認識する
            factory.setAttribute("http://apache.org/xml/features/validation/schema", new Boolean(true));
            // DOM Documenインスタンス用ファクトリの生成
            DocumentBuilder builder = factory.newDocumentBuilder();
            // エラーハンドラの登録
            builder.setErrorHandler(new XmlErrorHandler());
            // 解析とDocumentインスタンスの取得
            Document doc = builder.parse(new FileInputStream("sample09.xml"));
         } catch (Exception e) {}
    }
}

class XmlErrorHandler implements ErrorHandler{

    public void error(SAXParseException e){
        // エラー
        System.out.print("[error]:" + e.getLineNumber() + "行目:" + e.getMessage());
    }

    public void fatalError(SAXParseException e){
        // 深刻なエラー
        System.out.print("[fatal error]:" + e.getLineNumber() + "行目:" + e.getMessage());
    }

    public void warning(SAXParseException e){
        // 警告
        System.out.print("[warning]:" + e.getLineNumber() + "行目:" + e.getMessage());
    }
}


(XMLファイル)
コード:
<?xml version="1.0" encoding="Shift_JIS"?>
<order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sample09.xsd">
	<orderItem>
		<name>XML</name>
		<orderCount>2</orderCount>
	</orderItem>
	<orderItem>
		<id>4-8443-1780-6</id>
</order>


(Schema)
コード:
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	
	<xsd:element name="order">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="orderItem" maxOccurs="10" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<!-- orderItemの構造を作成 -->
	<xsd:element name="orderItem">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:choice>
					<xsd:element name="name" type="xsd:string" />
					<xsd:element name="id" type="xsd:string" />
				</xsd:choice>
				<xsd:element name="orderCount" type="xsd:nonNegativeInteger" minOccurs="0" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
</xsd:schema>

シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-01-19 12:17
コード:
        } catch (Exception e) {}


とりあえずcatchブロックでException#printStarckTrace()
してみてください。

そうすれば、もしプログラム実行中に例外が発生した場合には、
直ぐにわかるようになりますし、また出力された例外情報から
発生原因が推測できる可能性が高いです。
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2005-01-19 13:31
シュンさん

回答ありがとうございます。
catchでうまくエラーが取れました。

xmlのスキーマの参照部分が、「http://www.xxxx.xxxx/xx.xsd」のように
httpのURLの場合、構文解析が遅くなります。
これは、しょうがないのでしょうか。
よろしくお願いいたします。
けむ
常連さん
会議室デビュー日: 2003/09/26
投稿数: 40
投稿日時: 2005-01-19 14:31
引用:

xmlのスキーマの参照部分が、「http://www.xxxx.xxxx/xx.xsd」のように
httpのURLの場合、構文解析が遅くなります。


ネットワーク経由でスキーマを参照しているので当然遅くなります。
ローカルに同じxsdファイルが存在するのであれば、EntityResolverを使ってローカルのxsdファイルを参照させることができます。
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2005-01-19 17:25
けむさん

回答ありがとうございます。
「EntityResolver」を使用し、うまく参照できました。
ローカルのファイルを参照するようにしただけで、
時間も短縮されました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)