1

Gradle スクリプトに次のコード スニペットがあります (構文は Groovy/Java の組み合わせです)。

File file = new File(filename) // Filename is being read from console
def content = file.getText()
Document document = DOMBuilder.parse(new StringReader(content), false, false)

問題は、XML ファイルを解析しようとしていますが、xconf拡張子 (例: file.xconf) が付いていることです。何らかの理由で、上記のコードを試すと、(コンソールに) 次のエラー メッセージが表示されます。

java.io.FileNotFoundException: <full_path>/file.dtd (No such file or directory)

パスは正しいのですが、拡張子が突然 に変更されていることに気付きました.dtd。ファイルにそのファイルのバージョンへの参照があることに気付きましたが.dtd、パーサーにそれを無視してもらいたいです (そして検証を停止します。これが の 2 番目の引数 DOMBuilder.parse()が false である理由です)。ファイルを正常に解析できるように、この動作を変更できますか?

注: 可能であれば、(任意の) 他のファイル拡張子でも同じことができるようにしたいと考えています。

前もって感謝します!

4

3 に答える 3

1

これを試して:

import groovy.xml.*
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

Document parseWithoutDTD( Reader r, boolean validating=false, boolean namespaceAware=true ) {
  FactorySupport.createDocumentBuilderFactory().with { f ->
    f.namespaceAware = namespaceAware
    f.validating = validating
    f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
    f.newDocumentBuilder().with { db ->
      db.parse( new InputSource( r ) )
    }
  }
}

Document d = new File( filename ).withReader { r ->
  parseWithoutDTD( r )
}
于 2013-04-25T08:56:37.243 に答える
0

DTDは、XML ドキュメントのルールを定義します。これらのルールに従えば、xml ドキュメントは「有効」と見なされます。DTD ファイルを無視する場合 (たとえば、存在しないため)、解析の検証モードを false に設定します。

于 2013-04-25T08:38:15.740 に答える