4

内部に DTD 宣言がある XML ファイルの読み取りに問題があります (外部宣言は解決されています)。私は SAX メソッド (javax.xml.parsers.SAXParser) を使用しています。DTD 定義の解析がない場合、たとえば StartEement-Characters-StartElement-Characters-EndElement-Characters ...... のように見えます。したがって、Start または End 要素の直後に呼び出される characters メソッドがあり、それが必要です。DTD がファイル解析スキーマにある場合、たとえば StartElement-StartElement-StartElement-Characters-EndEement-EndEement-EndEement に変更されます。そして、すべての要素の後に Characters メソッドが必要です。それで、解析スキーマの変更を防ぐ方法はありますか?

私のコード:

SAXParserFactory factory = SAXParserFactory.newInstance();   
factory.setValidating(false);  

SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader(); 

reader.setFeature("http://xml.org/sax/features/validation", false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
reader.setFeature("http://xml.org/sax/features/use-entity-resolver2", false);   
reader.setFeature("http://apache.org/xml/features/validation/unparsed-entity-checking", false);
reader.setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);
reader.setFeature("http://apache.org/xml/features/validation/dynamic", false);
reader.setFeature("http://apache.org/xml/features/validation/schema/augment-psvi", false);

reader.parse(input);

リンクを解析しようとしている XML ファイルがあります(ドロップボックスのリンク)。

4

1 に答える 1

4

characters()以前はコールバックに報告されていたノードが、現在はコールバックに報告されていると思われignorableWhitespace()ます。最も簡単な解決策は、単にcharacters()fromを呼び出すことignorableWhitespace()です。

これは、仕様が述べなければならないことignorableWhitespace()です:

検証パーサーは、このメソッドを使用して、要素コンテンツ内の空白の各チャンクを報告する必要があります ( W3C XML 1.0 勧告のセクション 2.10 を参照)。非検証パーサーも、コンテンツ モデルを解析および使用できる場合、このメソッドを使用できます。

つまり、DTD があり、検証を行っていない場合、要素のみのコンテンツ モデルの空白をcharacters()コールバックまたは ignorableWhitespace()コールバックを使用して報告するかどうかは、パーサー次第です。

于 2012-04-21T17:10:20.240 に答える