SAXでparseを行う際の妥当性チェックについて

このQ&Aのポイント
  • XMLのパーサーにxercesを利用している場合、SAXでparseを行う際には、DTDとの妥当性をチェックすることができます。
  • ただし、通常はカレントディレクトリにあるDTDファイルを参照してチェックしますが、ファイルを無視して指定した文字列でチェックを行うことも可能です。
  • 具体的には、SAXParserFactoryクラスのsetValidatingメソッドをtrueに設定し、SAXParserクラスのparseメソッドでXMLをパースするときに、パースするXMLの妥当性をチェックすることができます。
回答を見る
  • ベストアンサー

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との妥当性をチェックしますが、 これをファイルは無視し、指定した文字列とチェックをさせるなどと いうことは可能でしょうか?

  • ns18
  • お礼率53% (55/102)
  • XML
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> 「a.dtdというファイルからではなく、文字列としてDTDの定義を >  保持しておき、文字列とXMLデータとの妥当性をチェックする」 質問は、ばっちり理解しましたが、回答できるだけの力量がありません (^^; 「何か知っていることがあれば」とのことなので、できる範囲で。 参考URLのひとつめ apache プロジェクトのマニュアルから SAXParser のページを見ると AbstractSAXParser クラスの startDTD() というメソッドがオーバーライドされて います。 こいつには XMLLocator というのを受け取ります(参考URLのふたつめ)。 それを適切に置き換えれば、何か出来そうな気が… 後、DTDGrammar というクラスもちょっと気になります。 # と言いつつ、マニュアルをあさってみましたが、いまいち有効な手段が見当たりません m(_ _)m

参考URL:
http://xml.apache.org/xerces2-j/javadocs/xerces2/index.html,http://xml.apache.org/xerces2-j/xni-core.html
ns18
質問者

お礼

回答ありがとうございます。 いろいろ調べましたが、 「a.dtdというファイルからではなく、文字列としてDTDの定義を  保持しておき、文字列とXMLデータとの妥当性をチェックする」 という方法は無理なような気がしてきました。 読み込んだXMLファイルの<!DOCTYPE>を保持しているDTDに変えて、 parseすれば妥当性のチェックはできると思うので、そうします。 ありがとうございました。

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

SAX は使ったことは無いんですが、マニュアルから分かる範囲で。 > カレントディレクトリにあるa.dtdとの妥当性をチェックしますが、 > これをファイルは無視し、 これは、SAXParseFactory に対して setValidating(true) をしなければ 良いんですよね。念の為、ということであれば setValidating(false) と しておけば良さそう。 > 指定した文字列とチェックをさせる については、それぞれの Handler でチェック込みの処理をすれば良いだけ のことです。

ns18
質問者

補足

回答ありがとうございます。 私の質問の仕方が悪かった&自分の理解が不十分でした。 すみません。m(__)m 補足します。 Javaで以下の処理をさせたいと考えています。 「a.dtdというファイルからではなく、文字列としてDTDの定義を  保持しておき、文字列とXMLデータとの妥当性をチェックする」 parseする必要はなく、あくまでも"妥当性のチェック"がやりたいのです。 もし、何か知っていることがあれば回答をお願いします。

関連するQ&A

  • 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
  • DTDファイルをクラスパスから読み込みたい

    DTDを利用したXMLファイルを読み込むDOMパーサーを作ってます。 表題のとおり、DOMパーサーがXMLファイル、DTDファイルを読み込む際に DTDファイルをローカルマシン(実行環境)のクラスパスにあるディレクトリ から読み込みたいのですがうまくいきません。 XMLパーサーにxercesを利用し、DOMを使ってます。 例えば、 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pagecontrol SYSTEM "sample.dtd"> <PEOPLE> <NAME>afternoon_cafe</NEME> </PEOPLE> のようなXMLファイルを、DOMパーサーがparse()メソッドによりロード すると、"sample.dtd"をカレントディレクトリからしか検索しません。 この"sample.dtd"をクラスパスにあるディレクトリに置き、それを 読み込むようにしたいのですが、、、 どなたかわかる方がいれば、教えてください。 お願いします。

    • ベストアンサー
    • XML
  • XMLEDITOR.NETでDTDを有効にするには

    XMLEDITOR.NETツールで、行数が多いXMLを読み込んでから、 [ツール(T)] - [妥当性検証(外部ファイル)(F)]をクリックし、 外部サブセット(別ファイル)のDTDファイルを選択したところ、 以下のエラーメッセージが表示されます。  ↓ 「セキュリティ上の理由から、DTDはこのXMLドキュメントでは使用  できません。DTD処理を有効にするには、XmlReaderSettingsの  ProhibitDtdプロパティをFalseに設定し、XmlReader.Createメソ  ッドにその設定を渡してください。」 ネットでいろいろ調べたところ、 マイクロソフトのSystem.xml.dllモジュール内のようなのですが、 有料のマイクロソフトツール等、私は持っていない為、 そのDLL内を編集することが出来ない状況です。 やはり、有料のマイクロソフトツールを購入して利用しないと、 このエラーは解消出来ないのでしょうか? PS: 私が実施したいことは、単に、 外部DTDファイルとXMLファイルとの間における 「妥当な文書(valid XML document)」を、 チェックしたいだけなので、 もし、 上記エラーが解消出来ないようでしたら、 他に良いバリデータ(検証ツール)があれば、 そちらを教えていただけましたら幸いです。 ちなみにネットで調べて、「MSV(Oracle Multi-Schema XML Validator)」を 試してみましたが、実行すると、 以下のエラーメッセージが表示されて、  ↓ Exception in thread "main" java.net.MalformedURLException: no protocol: xmlCheck /test20120508.dtd/test20120508.xml at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.startDocumentEntity(Unknown Source) at org.apache.xerces.impl.XMLDocumentScannerImpl.setInputSource(Unknown Source) at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at com.sun.msv.reader.util.GrammarLoader._loadSchema(GrammarLoader.java:513) at com.sun.msv.reader.util.GrammarLoader.parse(GrammarLoader.java:331) at com.sun.msv.driver.textui.Driver.run(Driver.java:217) at com.sun.msv.driver.textui.Driver.main(Driver.java:68) こちらも今のところ利用出来ていない状況です。 以上になります。 よろしくお願いします。

    • ベストアンサー
    • XML
  • 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
  • XMLパーサーであるXerces-P (ざーしず)と XSLT プロセッサである XT について

    XSLTプロセッサであるXTとXMLパーサーであるXerces-Pを使用してXMLからHTMLを生成しようと考えているのですが、XMLパーサーであるXerces-Pについて教えて下さい。 Q1.Xerces-P+XTの場合はJavaは必要ないのでしょうか? Q2.Xerces-Pのインストール方法やTXからの使用方法が詳細が記載されているお薦めのURL 宜しく御願いします。

    • 締切済み
    • 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_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
  • 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
  • DTD作成について

    以下のXMLをDTDに使用としています。 B以降の設定の方法が分かりません。 よろしくお願い致します。 XML - <Aブロック> - <A a番号="01" b="xxxx" c="x"> <B 番号="1" d="xxxx" /> <B 番号="2" d="xxxx" /> <B 番号="3" d="xxxx" /> </A> DTD <!ELEMENT Aブロック (A*)> <!ELEMENT A EMPTY> <!ATTLIST A a CDATA #REQUIRED> <!ATTLIST A b CDATA #REQUIRED> <!ATTLIST A c CDATA #REQUIRED>

    • ベストアンサー
    • XML
  • DTDを記述する意味

    DTDを使ってXMLの形式を厳密に定義する方法があると聞いて試してみたのですが、記述した形式を破っても何も起きません。たとえば以下のように <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ELEMENT root (a, b, c+)> ]> <root> <b>BBB</b> <a>AAA</a> </root> と書いた場合、「A,B,Cという要素をこの順番で配置せよ」という命令と「Cという要素を1つ以上配置せよ」という2つの命令を無視していますが、何かしらのエラーを返すといった動作は全くありません。HTML(XHTML)みたいな感じです(テキトーにコーディングしてもエラーを返さない点)。XMLのDTDはそれを守らないとエラーを返すような動作はしないのでしょうか?それではDTDの存在意義が分からなくなってしまいますが・・・

    • 締切済み
    • XML

専門家に質問してみよう