VTD-XML 似乎破坏了 XML 文档中的转义字符串
VTD-XML seems to be spoiling escaped string in XML document
我正在处理 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–. 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
}
当我用示例 xml(从相同数据复制粘贴的片段)测试 finerParse
方法时,它工作正常。但是当从上面的代码调用时,它失败并显示错误消息 Errors in Entity: Illegal entity char
。将输入打印到 finerParse
(即 drugXML
字符串)后,我注意到原始 xml 中的字符串 &pg=PA440
已更改为“&pg=PA440”。
为什么会这样?我所做的就是使用非常知名的解析器对其进行解析。
P.S。我 找到了一个替代解决方案,我只是将 VTDNav 作为参数传递给 finerParse
,而不是首先获取内容字符串并传递该字符串。但是我还是很好奇上面的做法到底出了什么问题
而不是 vtdNav.toString() 使用 vtdNav.toRawString() 问题应该会消失...让我知道它是否有效。
我正在处理 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–. 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
}
当我用示例 xml(从相同数据复制粘贴的片段)测试 finerParse
方法时,它工作正常。但是当从上面的代码调用时,它失败并显示错误消息 Errors in Entity: Illegal entity char
。将输入打印到 finerParse
(即 drugXML
字符串)后,我注意到原始 xml 中的字符串 &pg=PA440
已更改为“&pg=PA440”。
为什么会这样?我所做的就是使用非常知名的解析器对其进行解析。
P.S。我 找到了一个替代解决方案,我只是将 VTDNav 作为参数传递给 finerParse
,而不是首先获取内容字符串并传递该字符串。但是我还是很好奇上面的做法到底出了什么问题
而不是 vtdNav.toString() 使用 vtdNav.toRawString() 问题应该会消失...让我知道它是否有效。