- PR -

SAXの妥当性検証について

1
投稿者投稿内容
banboo
大ベテラン
会議室デビュー日: 2003/12/05
投稿数: 210
投稿日時: 2004-03-09 00:53
SAXの妥当性検証について質問が御座います。
SAXにおいて妥当性検証が行なわれるタイミングについて
調べております。

下記のようなXML文書とスキーマを用意し
調べてみました。プログラムでは、タグやテキストが読みこまれる毎
に内容を表示させるようにしております。また、妥当性検証で
XML文書がスキーマと一致しなかった場合も、エラーを表示する
ようにしております。

質問したい事は、下記でcustomer.xmlはXMLSchemaの文法と一致しているのに
何故、
cvc-elt.1: Cannot find the declaration of element 'customer'.
と表示されるのでしょうか?

どなたかご存知の方がいらっしゃいましたらご教授お願い
致します。

----customer.xml---------
<?xml version="1.0"?>
<customer id="111111">
<name>Take</name>
<address>Tokyo</address>
</customer>

------customer.xsd---------

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="address" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>


-----コンソールに表示された内容------------
startDocument
エラー: 2行目
cvc-elt.1: Cannot find the declaration of element 'customer'.
startElement: customer
characters:

startElement: name
characters: Take
endElement: name
characters:

startElement: address
characters: Tokyo
endElement: address
characters:

endElement: customer
endDocument


----SAXParseSample.java-------------

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

class SAXParseSample {
public static void main(String[] args) {
try {
// SAXパーサのファクトリーの生成
SAXParserFactory factory = SAXParserFactory.newInstance();
// フィーチャーの設定
factory.setValidating(true);
factory.setNamespaceAware(true);
factory.setFeature("http://apache.org/xml/features/validation/schema",true);
// SAXパーサの生成
SAXParser parser = factory.newSAXParser();
// ハンドラの生成
DefaultHandler handler = new SAXHandler();
// 解析
parser.parse(args[0],handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}

-----SAXHandler.java-----------------
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class SAXHandler extends DefaultHandler implements ErrorHandler {

public void startDocument() {
System.out.println("startDocument");
}

public void endDocument() {
System.out.println("endDocument");
}

public void startElement(
String namespaceURI,
String localName,
String qName,
Attributes atts) {

System.out.println("startElement: " + qName);
}

public void endElement(
String namespaceURI,
String localName,
String qName) {

System.out.println("endElement: " + qName);
}

public void characters(char[] ch, int start, int length) {
System.out.print("characters: ");
for (int i = 0; i < length; i++) {
System.out.print(ch[start + i]);
}
System.out.println();
}

public void warning(SAXParseException e) {
System.out.println("警告: " + e.getLineNumber() + "行目");
System.out.println(e.getMessage());
}
public void error(SAXParseException e) {
System.out.println("エラー: " + e.getLineNumber() + "行目");
System.out.println(e.getMessage());
}
public void fatalError(SAXParseException e) {
System.out.println("深刻なエラー: " + e.getLineNumber() + "行目");
System.out.println(e.getMessage());
}

}

スキーマ
会議室デビュー日: 2003/11/26
投稿数: 10
投稿日時: 2004-03-09 14:57
初めて投稿します。
ちょっとXML&Javaをかじってたので、参考書片手に読み返してみると・・
どうもcustomer.xmlにはスキーマ文書との関連付けがなされてないようです。
これがエラーの原因では??
関連付けはルート要素に書き込むようですが・・
<?xml version="1.0"?>
<customer xsi:xmlns="〜"
xsi.shcemaLocation="〜">ってかんじ?
まちがってたならすいまそん
1

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