vtd-xml - VTD-XML 元素片段不正确
问题描述
在使用 VTD-XML 解析包含像 © 这样的特殊字符的 XML 文档(UTF-8 格式)时,我现在遇到返回的元素片段 (getElementFragment) 不正确的问题。
示例代码:
VTDGen vg = new VTDGen();
String xmlDocument =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
"<Root>\r\n" +
" <!-- © -->\r\n" +
" <SomeElement/>\r\n" +
"</Root>";
// For some reason with US_ASCII it does work, although the file is UTF-8.
vg.setDoc(xmlDocument.getBytes(StandardCharsets.UTF_8));
// True or false doesn't matter here, some result.
vg.parse(false);
// Find the element and its fragment.
VTDNav nv = vg.getNav();
AutoPilot ap = new AutoPilot(nv);
ap.selectXPath("//SomeElement");
while ((ap.evalXPath()) != -1) {
long elementOffset = nv.getElementFragment();
int contentStartIndex = (int)elementOffset;
int contentEndIndex = contentStartIndex + (int)(elementOffset>>32);
System.out.println("Returned fragment: " + contentStartIndex + ":" + contentEndIndex + ":\n'" + xmlDocument.substring(contentStartIndex, contentEndIndex) + "'");
}
这将返回:
Returned fragment: 65:79:
'SomeElement/>
'
虽然将 StandardCharsets.UTF_8 更改为 StandardCharsets.US_ASCII 它确实有效:
Returned fragment: 64:78:
'<SomeElement/>'
当输入文件是 UTF-8 文件时,这会导致不正确的行为。这可能是 VTD-XML 中的错误,还是我在这里做错了什么?
解决方案
“©”是一个两个字的 unicode 字符,它导致开始/结束 unicode 偏移量从开始/结束字节偏移量偏移 1。这不是错误...下面是修复
while ((ap.evalXPath()) != -1) {
long elementOffset = nv.getElementFragment();
int contentStartIndex = (int)elementOffset;
int contentEndIndex = contentStartIndex + (int)(elementOffset>>32);
System.out.println("Returned fragment: " + contentStartIndex + ":" + contentEndIndex + ":\n'"
+ nv.toString(contentStartIndex,(int)(elementOffset>>32)));
//+ xmlDocument.substring(contentStartIndex, contentEndIndex) + "'");
}
推荐阅读
- c# - C#使用列表查找类中的元素
- python - 从csv中提取元数据而不在python中加载数据
- java - 验证一个函数是从另一个函数 mockito 调用的
- c# - 运行 C# 几分钟后出现计时器错误
- .net - Oracle PL/SQL 存储过程为定义为 SELECT TO_CHAR(date, format) 的参数返回 null
- elasticsearch - 更改索引的默认相似度
- javascript - Promise.all() 中的 Promise 状态和查询是什么?
- kotlin - 为什么不能在 build.gradle.kts 中使用 `const val`
- c# - 在 Docker.DotNet 中,如何通过指定 Dockerfile 的目录来构建镜像?
- arrays - 将列向量转置为行向量