【发布时间】:2013-07-19 03:11:25
【问题描述】:
我正在尝试使用 VTD-XML 从父元素中删除一组子元素。
不幸的是,删除一个元素后,它会留下已删除元素先前占用的新行。 VTD-XML 作者here 的一篇关于VTD-XML 的文章的读者也观察到了这种行为。我正在研究如何删除这条新行。
通过操纵存储在底层 64 位 VTD 令牌中的长度值来覆盖换行符(额外的 2 个字节),我设法取得了一点成功。代码sn-p如下:
// XMLModifier modifier
modifier.remove(vn.getElementFragment()+0x200000000L);
我已经测试了这在 VTD-XML 示例的ex_16 中提供的old_cd.xml 上运行良好。
但是,当我在我的工作文件上尝试同样的方法时,当我尝试调用 modifier.output() 时会引发 ModifyException 错误,特别是由 modifier.check2() 引发的错误。
问题
1。为什么上述方法会导致check2() 失败?我认为我没有溢出 VTD 令牌上的位,文件小于 2MB。 请参阅更新。
2. 有没有更好的办法去掉剩余的新行?
我对 VTD-XML 还很陌生,因此我非常感谢任何建议和见解,并向更有经验的用户学习。
感谢您的帮助。
更新
哇,在写这个问题的过程中,我意识到我忘记考虑不同的字符编码并将调整长值更新为 1 字节修复了check2() 问题! (花时间暂停并重新思考/写出问题的另一个原因)。
我仍然想从更有经验的用户那里了解是否有更好的方法。
【问题讨论】:
-
这是一个表演障碍吗?你设法解决了这个问题吗?
-
不是一个显示停止器,我确实解决了这个问题,但我想知道是否有更好的方法来使用 VTD-XML 删除新行,而不必直接操作底层令牌的位。如果没有实质性答案,我将添加我的方法的详细信息作为答案。
-
这必须在 api 级别完成,可能通过添加新方法来完成。请注意,元素段之前和/或之后可以有多个换行符。新方法也必须处理这一点。
-
是的,我同意这是我必须做的。我编写了一个非常简单的实用程序来使用 getCurrentDepth() 调用更新偏移和长度位。虽然我没有检查溢出,但对于大多数用例来说这应该不是问题。如果将 VTDNav 中编码的静态整数放在映射中以便快速查找字符集,也可能会很好。
-
2.12 将在 VTDNav 的核心 api 中添加一个名为 expandWhiteSpace 的方法,它需要一个 64 位并返回一个 64 位 int。