一部のフィールドに「&」などのエスケープされた XML 文字が含まれる XML データ セット (DrugBank データベースはこちらから入手可能) に取り組んでいます。
問題をより具体的にするために、シナリオの例を次に示します。
<drugs>
<drug>
<drugbank-id>DB00001</drugbank-id>
<general-references>
# Askari AT, Lincoff AM: Antithrombotic Drug Therapy in Cardiovascular Disease. 2009 Oct; pp. 440–. ISBN 9781603272346. "Google books":http://books.google.com/books?id=iadLoXoQkWEC&pg=PA440.
</general-references>
.
</drug>
<drug>
...
</drug>
...
</drugs>
ドキュメント全体が巨大であるため、次のように解析しています。
VTDGen gen = new VTDGen();
try {
gen.setDoc(Files.readAllBytes(DRUGBANK_XML));
gen.parse(true);
} catch (IOException | ParseException e) {
SystemHelper.exitWithMessage(e, "Unable to process Drugbank XML data. Aborting.");
}
VTDNav nav = gen.getNav();
AutoPilot pilot = new AutoPilot(nav);
pilot.selectXPath("//drugs/drug");
while (pilot.evalXPath() != -1) {
long fragment = nav.getContentFragment();
String drugXML = nav.toString((int) fragment, (int) (fragment >> 32));
System.out.println(drugXML);
finerParse(drugXML); // another method handling a more detailed data analysis
}
finerParse
サンプル xml (同じデータからコピーして貼り付けたスニペット) を使用してメソッドをテストしたところ、問題なく動作しました。しかし、上記のコードから呼び出すと、エラー メッセージ で失敗しましたErrors in Entity: Illegal entity char
。入力finerParse
(つまり、drugXML
文字列) を出力する&pg=PA440
と、元の xml の文字列が "&pg=PA440" に変更されていることに気付きました。
なぜこうなった?私がしているのは、非常によく知られているパーサーを使用して解析することだけです。
PS最初にコンテンツ文字列を取得してその文字列を渡す代わりに、VTDNavを引数として渡すだけの代替ソリューションを見つけました。finerParse
しかし、上記のアプローチで何がうまくいかないのか、私はまだ興味があります。