【问题标题】:Can VTD-XML take a String as an input?VTD-XML 可以将字符串作为输入吗?
【发布时间】:2025-12-27 14:30:11
【问题描述】:

嘿,我正在尝试使用 VTD-XML 来解析作为字符串提供给它的 XML,但我找不到如何去做。任何帮助将不胜感激。

http://vtd-xml.sourceforge.net

【问题讨论】:

    标签: java xml parsing vtd-xml


    【解决方案1】:

    似乎 VTD-XML 库可以让您读取字节数组数据。在这种情况下,我建议使用正确的编码将字符串转换为字节。

    如果在 XML 字符串的开头有编码信号:

    <?xml version="1.0" encoding="UTF-8"?>
    

    然后使用它:

    myString.getBytes("UTF-8")
    

    如果没有编码,请使用一个,因为 VTD-XML 知道如何解码字节:

    String withHeader  = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + myString;
    byte[] bytes = withHeader.getBytes("UTF-8");
    VTDGen vg = new VTDGen();
    vg.setDoc(bytes);
    vg.parse(true);
    

    请注意,在后一种情况下,您可以使用任何有效的编码,因为您在内存中的字符串与编码无关(它在 UTF-16 中,但当您请求字节时,它将被转换)。

    【讨论】:

    • 然后我用什么方法来加载它?设置文档?
    • 搞定了。谢谢!是的,它是一个 Java String 对象,它是一个非常快的解析器,而且我对 SAX 所需的 if 语句块不满意。整个令牌布局真的很方便。
    • 我将添加 setDoc 方法用于记录目的。
    【解决方案2】:

    VTD-XML 不接受字符串,因为字符串暗示 UCS-16 编码,这意味着它不是真正的 xml 文档。按照规范的定义,xml 通常以 utf-8、ascii、iso- 编码8859-1 或 UTF-16LE 或 BE 格式...我的回答有意义吗?

    【讨论】:

    • 不是真的...您在 ...?> 标头中定义 xml 文件的编码。字符串在 UCS-16 中进行内存编码,但您可以对其进行转换以匹配所需的编码。
    • 如果字符串是指 java 的 String 对象,那么我坚持我的回答……如果字符串是指字节数组,那么使用 ?> 决定编码...我觉得这个问题实际上是关于询问 Java 的字符串对象,但我可能是错的
    • 你的回答有意义吗?不,正如 helios 的回答所建议的那样,字符串可能包含一个声明编码的序言。因此,如 helios 所说,要将字符串转换为适合解析器使用的字节,您必须首先提取该编码。但通常解析器的工作是确定编码。我经常使用的所有解析器都可以接受 Reader 作为输入,这意味着解析器可以忽略编码问题,因为它已经获取了字符。因此,如果 VTD-XML 没有从 Reader 解析的方法,那么它就不是“先进和强大的”。
    • @Paul:感谢您的评论。我认为我们应该首先就字符串的含义达成一致。序言是告诉解析器编码格式是什么,以便字节到字符的转换可以正确发生。 XML 文档是一个字节数组,Reader 只是查看它的一种方式,但不是唯一的,对吧?所以使用 Reader 来判断解析器的优点听起来像是一个弱论点......
    • 我认为没有关于字符串是什么的争论。我同意你未说明的论点,即声明对未编码的东西进行编码是一种特殊的情况,但它确实发生了,我认为这并不罕见。但我不认为 XML 解析器处理 Reader 应该不是特别困难,而且我确实认为一个为自己做出宏大声明的解析器应该能够做那件小事。