2

一部のフィールドに「&」などのエスケープされた 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&#x2013;. ISBN 9781603272346. "Google books":http://books.google.com/books?id=iadLoXoQkWEC&amp;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文字列) を出力する&amp;pg=PA440と、元の xml の文字列が "&pg=PA440" に変更されていることに気付きました。

なぜこうなった?私がしているのは、非常によく知られているパーサーを使用して解析することだけです。

PS最初にコンテンツ文字列を取得してその文字列を渡す代わりに、VTDNavを引数として渡すだけの代替ソリューションを見つけました。finerParseしかし、上記のアプローチで何がうまくいかないのか、私はまだ興味があります。

4

1 に答える 1

1

vtdNav.toString() の代わりに vtdNav.toRawString() を使用すると、問題は解決するはずです...動作するかどうか教えてください。

于 2015-01-08T03:38:39.730 に答える