0

デフォルトの Woodstox EventReader を使用して XML ファイルを読み込んでいます。

XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(fileName));

入力ファイルのテキスト コンテンツに Unicode NULL 文字が含まれている場合、次の例外/スタックトレースが発生します。

WstxUnexpectedCharException.<init>(String, Location, char) line: 17 
ValidatingStreamReader(StreamScanner).constructNullCharException() line: 604    
ValidatingStreamReader(StreamScanner).throwInvalidSpace(int, boolean) line: 633 
ValidatingStreamReader(BasicStreamReader).readTextSecondary(int, boolean) line: 4624    
ValidatingStreamReader(BasicStreamReader).finishToken(boolean) line: 3661   
ValidatingStreamReader(BasicStreamReader).next() line: 1063 
WstxEventReader(Stax2EventReaderImpl).nextEvent() line: 255 

テキストコンテンツの検証を避けたいです。XMLInputFactory で IS_VALIDATING を設定しても問題は解決しません。

ソース コードを調べたところ、BasicStreamReader の next() は "mValidateText" 変数を参照して、検証するかどうかを判断しているようです。

ソースから:

/**
 * Flag that indicates that textual content (CDATA, CHARACTERS) is to
 * be validated within current element's scope. Enabled if one of
 * validators returns {@link XMLValidator#CONTENT_ALLOW_VALIDATABLE_TEXT},
 * and will prevent lazy parsing of text.
 */
protected boolean mValidateText = false;

InputFactory または EventReader でこの値を変更/設定する方法がわかりませんか? おそらく、ValidatingStreamReader ではなく TypedStreamReader を使用するように InputFactory に指示する必要がありますか?

4

2 に答える 2

3

不適切な形式のコンテンツを拒否するには、準拠した XML パーサーが必要です。(非) XML を修正し、パーサーにその仕事をさせる必要があります。

于 2013-01-26T09:12:19.837 に答える
1

これは検証ではなく、基本的な整形式の問題です。検証は、テキスト コンテンツの特定の構造や値を定義できる DTD、RelaxNG、XML スキーマなどのスキーマで使用されます。そのため、コンテンツが整形式の XML である場合に処理されるため、検証関連の設定は効果がありません。

必要なのは、コンテンツを前処理して、XML で違法な少数の文字を削除または置換することです。これには 0 バイトが含まれます。

于 2013-01-26T03:54:07.133 に答える