【问题标题】:VTD-XML seems to be spoiling escaped string in XML documentVTD-XML 似乎破坏了 XML 文档中的转义字符串
【发布时间】:2015-01-07 15:43:47
【问题描述】:

我正在处理一个 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(从相同数据复制粘贴的 sn-ps 方法)测试 finerParse 方法时,它运行良好。但是当从上面的代码调用时,它失败了,错误消息Errors in Entity: Illegal entity char。在将输入打印到finerParse(即drugXML 字符串)后,我注意到原始xml 中的字符串&amp;amp;pg=PA440 已更改为“&pg=PA440”。

为什么会这样?我所做的只是使用一个非常知名的解析器来解析它。

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

【问题讨论】:

  • 还有一个建议:永远不要传递字符串,你应该传递字节段,将字符串传递给另一个函数效率不高。
  • 感谢您的建议。我目前的方法是将 VTDNav 本身传递给finerParse。我没有做过任何基准测试,但直观地说,这应该是最有效的方法。我只需要注意正确使用toElement(int, String) 方法。如果我在这里错了,请纠正。

标签: java xml escaping vtd-xml


【解决方案1】:

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

【讨论】:

  • 像魅力一样工作!顺便问一下,是否有 VTD-XML 的权威文档?我一直在寻找简短的教程等,但没有什么全面的。而且 Javadoc 非常有限,这意味着对于许多方法(例如,如果我想知道 toString()toRawString()toNormalizedString()toNormalizedString2 之间的区别),很难弄清楚发生了什么开。
  • vtd-xml 网站上的所有文件都是权威的……您要找什么样的文件?有什么建议吗?
  • 对不起我之前的评论。我忘记将 javadoc 添加到我的项目中,所以一切都显示为空。纠正了这一点,生活就完美了。与基于 DOM 的解析器相比,VTD-XML 的学习曲线稍微陡峭,但它是一个了不起的工具,尤其是在速度优先的情况下!感谢您的 vtd-xml :-)
猜你喜欢
  • 1970-01-01
  • 2011-08-13
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多