3

私が抱えている問題は、SAX defaultHandler クラスの拡張機能を使用して 1 つの XML ドキュメントを解析したいということです。ハンドラーを 1 つだけ使用すると、XML を解析して、オブジェクトのプロパティにさまざまなタグを割り当てることができます (ドメインとエリアを参照)。これらをドメインとエリア オブジェクトに追加したら、ドメインとエリアのリストを持つ別のオブジェクト (GroupedFiles) に追加します。私が抱えている問題は、2 つのハンドラーを使用して 1 つのドキュメントを解析することです。私の理論は、最良のコーディング プラクティスではありませんが、ドキュメントを 2 回解析し、ドメイン ハンドラーを使用して 1 回実行し、ドメインを設定してから、グループ化されたファイルに追加し、次にエリアに対して同じことを行うというものです。ここにコードがあります、

GroupedFiles groupedFiles = new GroupedFiles();
ArrayList<Domain> domains = new ArrayList<Domain>();
ArrayList<Area> areas = new ArrayList<Area>();

//Create parser from factory
XMLReader parser = XMLReaderFactory.createXMLReader();

//Creates an input stream from the file "someFile.xml"
InputStream in = new FileInputStream(new File("someFile.xml"));
InputSource source = new InputSource(in);

//Create handler instances
DomainHandler domainHandler = new DomainHandler();
AreaHandler areaHandler = new AreaHandler();

//Parses out XML from a document using each handler, 
//adding it to an object with the correct properties then adds those
//to another object which features Lists of Domains, Areas, and Directories.
parser.setContentHandler(domainHandler);
parser.parse(source);
domains = domainHandler.getXML();
groupedFiles.setDomain(domains);

parser.setContentHandler(areaHandler);
parser.parse(source);
areas = areaHandler.getXML();
groupedFiles.setArea(areas);

しかし、私にはできず、2 番目にハングアップしたようparser.parse(source)です。ドメインを実行した後に groupedFiles を見ると、データが取り込まれていますが、領域は取り込まれていません。何かアドバイス?

4

1 に答える 1

6

複数のパスを作成する必要はありません。解析プロセス中にコンテンツ ハンドラーを交換できます。XMLReader新しいハンドラーに渡すために呼び出すことがsetContentHandlerできるメソッドがあります。たとえばstartElement、別のハンドラーによってカバーされる領域を開始するタグを認識した場合、または要素をそのままにendElementして前のコンテンツ ハンドラーに戻したい場合は、新しいコンテンツ ハンドラーを設定できます。

例については、このJavaWorld の記事を参照するか、この回答を確認してください。

于 2013-04-04T13:47:17.287 に答える