可能で、現在の行番号の構文解析時にXMLドキュメントとXerces?
-
05-09-2019 - |
質問
私はjavaプログラムを解析し、XMLドキュメントを使用xerces APIに含まれています。
私の構文解析のクラスはorg.apache.xerces.parsers.XMLDocumentParser、過積載のstartElement,endElement文字ます。
なかに複雑なXML文書が書けないので、手書きで書(主に何らかの構成要素)、クラシックの検証によるxsdはdtdが足りないのユーザーにこのXMLドキュメントでは無効です。
が1のものを思い出を実現する追加の情報をエラーメッセージのライン番号およびませんか列番号も)currenlty解析されているが、エラーが発生します。
したのではないかと思いことを可能にし、例外オーガニックシンセシス(org.apache.xerces.xni.パーサです。XMLParseException)発生するパーサが、XMLドキュメントは有効なXMLを含むこれらの情報を保存します。
解決
かでは絶対手に入らないことxerces、SAXパーサできますが、こSAX ロケータ, から取得することができる行と列記号としての文書を構文解析(後ます。
のようにな XMLDocumentParser
きも同じです。その親クラス AbstractXMLDocumentParser
, は、 startDocument 方法に渡される XMLLocator
パラメータとします。場合このメソッドをオーバーライド保存することができます XMLLocator
およびその利用 getLineNumber
や getColumnNumber
ます。
他のヒント
「正しい」方法がどうなるかわからなく、APIを見ていない、あなたがたInputStreamまたはあなたがLineNumberInputStreamまたはLineNumberReaderで包み、それを照会されたInputStream / Readerで提供できるリーダーを取るXMLInputSourceを提供仮定行番号のます。
例:
InputStream stream; stream = ...; new XMLInputSource(stream);
になるます:
InputStream stream; LineNumberInputStream lineStream; stream = ...; lineStream = new LineNumberInputStream(lineStream); new XMLInputSource(lineStream); // can now ask the line stream what line it is on via getLineNumber()
私はあなたにもXMLDocumentParserを拡張するクラスにLineNumberInputStream / LineNumberReaderに合格する必要があります推測しています。
そのすべてがあなたのコードでなんとかですかどうかわからない。
また、ソースに掘ると、彼らはそれを行う方法を見つけます。あなたがアクセスする必要のある変数/メソッドがプライベートであり、あなたのコードは、将来的に壊す心配されていない場合、あなたはそれを取得するためにリフレクションを使用してアクセス権限を削除することができます。