- みーちく
- 大ベテラン
- 会議室デビュー日: 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」を使用し、うまく参照できました。
ローカルのファイルを参照するようにしただけで、
時間も短縮されました。
ありがとうございました。
|