VTD-XML似乎破坏了XML文档中的转义字符串

时间:2015-01-07 15:43:47

标签: java xml escaping vtd-xml

我正在处理XML数据集(DrugBank数据库可用here),其中某些字段包含转义的XML字符,如"&"等。

为了使问题更具体,这是一个示例场景:

<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
}

当我使用示例xml(从相同数据复制粘贴的片段)测试finerParse方法时,它运行正常。但是,当从上面的代码调用时,它失败并显示错误消息Errors in Entity: Illegal entity char。在将输入打印到finerParse(即drugXML字符串)后,我注意到原始xml中的字符串&amp;pg=PA440已更改为&#34;&amp; pg = PA440&#34 ;

为什么会这样?我正在做的就是使用一个非常着名的解析器来解析它。

P.S。我已经找到了一个替代解决方案,我只是将VTDNav作为参数传递给finerParse,而不是先获取内容字符串并传递该字符串。但我仍然对上述方法出了什么问题感到好奇。

1 个答案:

答案 0 :(得分:1)

使用vtdNav.toRawString()代替vtdNav.toString(),问题应该消失......让我知道它是否有效。