SAXでXMLファイルを読むときにチェックする方法

このQ&Aのポイント
  • SAXParserFactoryを使用してXMLファイルを読み込む際に、DTDのチェックを行う方法を説明します。
  • SAXParserFactoryのsetValidatingメソッドをtrueに設定することで、DTDのチェックを有効にします。
  • また、SAXのバージョンによっても結果が異なる場合があるため、バージョンにも注意が必要です。
回答を見る
  • ベストアンサー

SAXでXMLファイルを読むときにチェック(?)する

お世話になります。 <?xml version="1.0"?> <!DOCTYPE A [ <!ELEMENT A (B)> ]> <A> </A> 上記のXMLをSAXにてparseをかけると多分「定義とちがうじゃん!」というような趣旨のエラーがでるとおもっていたのですが、普通に処理されてしまいました。 DTDのチェックってどうやってやるのでしょうか? SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setValidating(true); SAXParser parser = factory.newSAXParser(); parser.parse(xmlFile, new DefaultHandler()を拡張したクラス); このようなかんじでやっているのですが、 これがまちがえていますか? SAXのバージョンとかも関係するのかもしれないのですが、 これ使ってともらったやつなのでどのように調べていいのかわかりません。 以上よろしくお願い致します。

  • Java
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • tekebon
  • ベストアンサー率62% (36/58)
回答No.1

DefaultHandlerはErrorHandlerを実装していますが、 この中のerror()メソッドはオーバーライドしていますか? 妥当でない場合にはこのerror()メソッドが呼び出されるようになっています。 (データとしては致命的ではないのでparse()メソッドに対する例外は発生しません) DeafaultHandlerを拡張したクラスに public void error(SAXParseException exp){ System.out.println("妥当でないかも"); } の記述を追加してみてください。 詳しくはAPIドキュメントのorg.xml.sax.ErrorHandlerを確認してみてください。

chi-kon
質問者

お礼

早速のご解答ありがとうございます。 アドバイスを参考にやってみたところできました。 自分としてはDTDのそぐわないとなにかすごい例外がでて 処理がストップするものだと思っていました。 仕様としてこうなっているのですね。 APIもこういうところまで読まないとだめですね。。。 ありがとう御座いました。

関連するQ&A

  • SAXでparseを行う際の、DTDとの妥当性チェックついて

    Java&XMLの初心者です。 用語の使い方など間違っているかもしれませんが、 よろしくお願いします。 XMLパーサーにxercesを利用しています。 以下のようなXMLをがあったときに、 <?xml version="1.0"?> <!DOCTYPE a SYSTEM "a.dtd"> <a> <b>1</b> <b>1</b> </a> 以下のコードを実行すると、  SAXParserFactory f = SAXParserFactory.newInstance();  f.setValidating(true);  SAXParser p = f.newSAXParser();  p.parse((InputSource)xml, handler); カレントディレクトリにあるa.dtdとの妥当性をチェックしますが、 これをファイルは無視し、指定した文字列とチェックをさせるなどと いうことは可能でしょうか?

    • ベストアンサー
    • XML
  • XML ファイル parse 時の例外発生

    XML ファイル parse 時の例外発生 Java プログラムにて UTF-8 で書いた XML ファイルを DOM オブジェクトに読み込むときに、CJK Unified Ideograph Extension B などの (UTF-16 にて surrogate pair となるような) 字をコメント内に書くと、例外が発生します。何かよい回避方法は無いでしょうか。 例外は: org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0xd85a) was found in the comment. XML ファイルは encoding="UTF-8" としており、コメント以外のテキストにこれを書く分には、特に問題無く parse できています。 読み取りは DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setIgnoringComments(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("hoge.xml"); などとしています。JDK のバージョンは 1.6.0_17-b04 on Windows Vista。 当該文字を "" で囲んだり、通るタグ記述の形のままコメント化したりもしましたが、だめでした。 以上、よろしくお願いいたします。

  • JAXPのDTD検証

    JAXPを使ってXMLの解析をしてるのですが、DTD検証を無効にする方法はあるのでしょうか? XMLに、DTDが記述されているとURLを参照しようとしてエラーになってしまいます。 これを無視するようにしたいのですが。。 ---ソース--- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(false); factory.setIgnoringComments(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( "hoge._xml" );

    • ベストアンサー
    • Java
  • DTDとXML Schemaでのデフォルト値の指定について

    以下のようなXMLをパーズするプログラムがあります。 ------------------------------------------------------------------ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setValidating(true); DocumentBuilder documentBuilder = factory.newDocumentBuilder(); Document doc = documentBuilder.parse(new InputSourc("a.xml")); ------------------------------------------------------------------ a.xmlに以下のようなXMLの構造をDTDで指定した場合のxmlをパーズさせると、 <!DOCTYPE a [ <!ELEMENT a (#PCDATA)> <!ATTLIST a a1 CDATA "abc"> ]> <a/> 上記のプログラム3行目のvalidationの設定がtrue、falseに関わらす、 <a a1="abc"/> というような形式のドキュメントオブジェクトが返ってきます。 ですが、以下のようにXMLの構造をXML Schemaで定義した場合、 a.xml <a xsi:noNamespaceSchemaLocation="b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> b.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="a"> <xsd:complexType> <xsd:attribute name="a1" type="xsd:string" default="abc"/> </xsd:complexType> </xsd:element> </xsd:schema> 返ってくるドキュメントオブジェクトのa要素には、validationがtrueの場合はa1属性が含まれる、falseの場合は含まれません。 これは正しい動作なのでしょうか? また、XML Schemaの場合もvalidationがtrue、falseに関わらず、 デフォルト値が指定された属性を含めることはできないのでしょうか?

    • ベストアンサー
    • XML
  • Java ファイルオブジェクトでなく文字列オブジェクト?

    JavaでXMLをパースするプログラムを初めて試しています。 parseメソッドの第一引数がファイルオブジェクトなのですが、これをメモリ(文字列)オブジェクトを与えて同じ動作させるものはあるのでしょうか? // SAXパーサーファクトリを生成 SAXParserFactory spfactory = SAXParserFactory.newInstance(); // SAXパーサーを生成 SAXParser parser = spfactory.newSAXParser(); // XMLファイルを指定されたデフォルトハンドラーで処理します parser.parse(new File("helloworld.xml"), new InsXMLParser()); ※このように String str = "<xml? ......"; parser.XXXXXX(str, new InsXMLParser

    • ベストアンサー
    • XML
  • 妥当なXML文書

    XML文書で、下記のあ)い)で、妥当なXML文書は あ)になります。 では、い)は妥当ではないとしたら、どの部分が妥当ではないでしょうか。 これが理解できずに困っています。 <a/>は親要素にならないのでしょうか。ルートになるからでしょうか。 よろしくお願いします。 あ) <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE a [ <!ELEMENT a (b?)> <!ELEMENT b (#PCDATA)> ]> <a/> い) <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE a [ <!ELEMENT a (b?)> <!ELEMENT b (#PCDATA)> ]> <a/><b/>

    • ベストアンサー
    • XML
  • XMLファイルからXML Schemaを参照する方法?

    XMLファイルの設計をしています。 今まではDTDを使っていたのですが、 勉強するとXML SchemaのほうがXMLの規則にそっていたり、 データ型が多かったりして都合が良い面があると学びました。 そこでXML Schemaを使いたいと思うのですが、 XML SchemaとメインのXMLのファイルはどのように関係させたら良いのでしょうか? DTDのときは以下のように書いていたと思います。 <!DOCTYPE root SYSTEM "sample.dtd" > このような記述をXML Schemaのときには、どのように記載するのだろうと 疑問に思いました。 私なりに調べてみたのですが、 XML Schemaの記述方法は、大まかに理解したのですが、 関係方法をどうすれば良いかは、見つけられませんでした。 本を読んでも、書かれているように思えません。 以下の2つのファイルがあった場合、 【element1.xml】は妥当なXML文書だそうですが、 どのように関連付いているのでしょうか? 【element.xs】 <?xml version="1.0" encoding="Shift_JIS" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 要素宣言 --> <xs:element name="売上高" type="xs:integer" /> </xs:schema> 【element1.xml】 <?xml version="1.0" encoding="Shift_JIS" ?> <売上高>1000</売上高> もしよろしければ、教えて頂けませんか? ぜひご教示お願いいたします。

    • ベストアンサー
    • XML
  • XMLパーサの種類について混乱してます

    XSLTをいじる必要に駆られて、現在Java1.4+JAXP1.1を利用しています。 いままで、javax.xml.transformをimportしてメソッドを実行するだけで、「変換系に何を使っているのか」については全く気にしていなかったのですが、その実体は何なのでしょうか? (XTとかXalanとか、単体の変換系がありますよね・・・?) また、DOMパーサ、SAXパーサもJAXPで使えますが、各々のパーサや変換系を集めてパッケージにしたものがJAXPなんでしょうか。 さらに、勉強中にXMLパーサという単語が出てきて混乱しています。XMLパーサは、DOM・SAX・XSLT等とは違うのでしょうか? (XMLパーサと名乗っているXercesは何に使うのでしょうか・・・) DTDとの関連も含めて解説して頂けたら嬉しいです。

    • ベストアンサー
    • Java
  • VBでXMLファイルを作ると xmlns= が・・・

    VB6でXMLを作成しています。 Dim xmlDoc As New MSXML2.DOMDocument40 'XMLドキュメント Dim xmlPI As IXMLDOMProcessingInstruction 'XML宣言 Dim node(7) As IXMLDOMNode '要素 Set xmlPI = xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version= ""1.0"" encoding= ""Shift_JIS"" standalone= ""no""")) Set node(1) = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "kml", "")) Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "kmlHeader", "")) Set node(3) = node(2).appendChild(xmlDoc.createNode(NODE_ELEMENT, "kml_DTD", " kml_Version= 2.8"" kml_FileName=""../DTD/HYB01.dtd")) 以下省略 すると <kml_DTD xmlns="kml_Version= 2.8" kml_FileName="../DTD/HYB01.dtd" /> "xmlns=" はどうすれば消えますか?お願いします。

  • xml_parseで実体参照が無視される

    phpでxmlをparseするコードを作成していますが、 動きが良く分からないものがあったので質問です。 以下のような、XMLがあります。 ・XML <a>1&lt;2<a> これを以下のようなPHPでparseします。 ・php function func_char($parser, $data){ print "char: $data\n"; } $parser = xml_parser_create(); xml_set_character_data_handler($parser , "func_char"); xml_parse($parser, "<a>1&lt;2<a>"); 出力が以下のようになります。 ・出力結果  char: 1  char: 2 間に"char: <"が出力されるかと思ったのですが、出力されません。 何か心当たりのある方はいらっしゃいますでしょうか? 実行環境 ---------------------- OS:CentOS 5.2 Apache 2.2.9 php 5.2.6 libxml2 2.7.2 ----------------------

    • 締切済み
    • PHP

専門家に質問してみよう