当前位置: 首页 > 知识库问答 >
问题:

VTD-XML元素片段不正确

暴辰龙
2023-03-14

在使用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/>
'

当更改标准字符集时。UTF_8转换为标准字符集。US\u ASCII它确实有效:

Returned fragment: 64:78:
'<SomeElement/>'

当输入文件是UTF-8文件时,这会导致不正确的行为。这可能是VTD-XML中的错误,还是我在这里做错了什么?

共有1个答案

程承恩
2023-03-14

“©”是一个两字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) + "'");
        }
 类似资料:
  • 我遇到了奇怪的问题,我在网上找不到任何东西。 我使用xpath定位我的xml块,然后用其他内容替换它,例如: 我使用XMLModifier来实际更新令牌(使用updateToken方法:),它用于属性操作或元素的文本(正文)。 我对样式元素有问题,我想处理它的主体,然后用指向某个文件的链接替换整个元素。 显然,更新文本标记将导致样式标记和其中的链接标记。 所以我试着把导航器移到样式元素,得到了这个

  • VTD-XML是一种新的XML处理API,它能够克服DOM和SAX的一些问题。VTD-XML能够在内存中对XML进行快速检查并提供XPath查询支持。 在它的主页上有详细的API描述,源代码,文档和例子。

  • 我有两个xml文件。一个是参考(旧)文件,另一个是测试(新)文件。根据提供给我的一些规则,我必须检查是否有东西从旧模型中删除,然后添加到新模型中,或者检查是否有东西从旧文件中删除到新文件中。 我使用的是VTD-XML,但DOM解决方案或任何其他与xpath一起使用的解决方案将非常有用。 这是java代码: 1) 在ref文件上完成xpath后,我得到man节点的所有属性: 我得到name属性的值。

  • 问题内容: 我阅读了很多有关片段的文章,但是我仍然对如何做感到困惑。 我有一个MainActivity,它并排显示两个片段。在一个片段中,我有一个按钮,并在该片段的片段布局XML中定义 现在我要实现该方法 我以为必须在FragmentA.java中实现,而不是在MainActivity.java中实现。但是,只有在MainActivity.java中实现了该方法后,该方法才有效。这是为什么?对我而

  • 我对如何做到这一点有点困惑,所有的文档/示例都展示了如何读取和编辑xml文档,但似乎没有任何从头开始创建xml的明确方法,我宁愿不必将我的程序与虚拟xml文件一起发布以编辑一个。有什么想法吗?谢谢。

  • 主要内容:什么是 XML 元素?,XML 命名规则,最佳命名习惯,XML 元素是可扩展的XML 文档包含 XML 元素。 什么是 XML 元素? XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。 一个元素可以包含: 其他元素 文本 属性 或混合以上所有... <bookstore> <book category="CHILDREN"> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2