4

xerces API を使用して XML ドキュメントを解析する Java プログラムがあります。

私の解析クラスは org.apache.xerces.parsers.XMLDocumentParser を拡張し、startElement、endElement、characters メソッドをオーバーロードします。

これは手動で記述された複雑な XML ドキュメント (主に何らかの構成要素) であるため、xsd または dtd による従来の検証では不十分であり、XML ドキュメントが有効でないことをユーザーに返す必要があります。

しかし、私が達成できなかった1つのことは、現在解析されているエラーメッセージとエラーが発生した場所に関する行番号(および列番号ではない理由)に関する情報を追加することです。

XMLドキュメントがXML有効でない場合にパーサーによって生成される例外(org.apache.xerces.xni.parser.XMLParseException)にはこれらの情報が含まれているため、これが可能であると思います。

4

2 に答える 2

6

xerces でこれを試したことはありませんが、SAX パーサーは SAX Locatorを格納できます。ドキュメントが解析されるとき (または例外の後) に、そこから行番号と列番号を取得できます。

同じXMLDocumentParserことができるようです。その親クラスであるAbstractXMLDocumentParserには、パラメーターが渡されるstartDocumentメソッドがありXMLLocatorます。このメソッドをオーバーライドすると、 を保存してそのメソッドとメソッドXMLLocatorを使用できます。getLineNumbergetColumnNumber

于 2009-02-20T17:55:17.727 に答える
1

「正しい」方法が何であるかはわかりませんが、API を見て、InputStream または Reader を取る XMLInputSource を提供すると仮定すると、LineNumberInputStream または LineNumberReader でラップされた InputStream/Reader で提供でき、行に対してクエリを実行できます番号。

例えば:

InputStream ストリーム。

ストリーム = ...;

新しい XMLInputSource(ストリーム);

次のようになります。

InputStream ストリーム。
LineNumberInputStream lineStream;

ストリーム = ...;
lineStream = 新しい LineNumberInputStream(lineStream);

新しい XMLInputSource(lineStream);

// getLineNumber() を介してライン ストリームに現在のラインを問い合わせることができるようになりました

XMLDocumentParser を拡張するクラスに LineNumberInputStream/LineNumberReader を渡す必要もあると思います。

そのすべてがコードで実行可能かどうかはわかりません。

または、ソースを掘り下げて、その方法を見つけてください。アクセスする必要がある変数/メソッドがプライベートであり、将来コードが壊れることを心配していない場合は、リフレクションを使用してアクセス許可を削除してアクセスすることができます。

于 2009-02-20T16:46:17.830 に答える