解析格式错误/不完整/无效的XML文件。

6

我有一个使用JDOM和xpath解析XML文件的过程,代码如下:

private static SAXBuilder   builder         =   null;
private static Document     doc         =   null; 
private static XPath        xpathInstance       =   null;

builder = new SAXBuilder();
Text list = null;

try {
    doc = builder.build(new StringReader(xmldocument));

} catch (JDOMException e) {
            throw new Exception(e);
} 



try {
    xpathInstance = XPath.newInstance("//book[author='Neal Stephenson']/title/text()");
    list = (Text) xpathInstance.selectSingleNode(doc);
} catch (JDOMException e) {
    throw new Exception(e);
}

以上代码运行良好。XPath表达式存储在属性文件中,因此可以随时更改。现在,我必须处理一些来自遗留系统的XML文件,该系统仅以4000字节的块发送XML文件。现有处理方式读取4000字节的块并将其存储在Oracle数据库中,每个块作为数据库中的一行(不考虑对遗留系统或存储块作为行的处理进行任何更改)。
我可以通过提取与特定XML文档相关的所有行并合并它们来构建完整的有效XML文档,然后使用现有处理方式(如上所示)解析XML文档。
问题是,我需要从XML文档中提取的数据总是位于前4000个字节。当然,这个块不是一个有效的XML文档,因为它是不完整的,但包含了我需要的所有数据。我无法仅解析一个块,因为JDOM构建器会拒绝它。
我想知道是否可以在没有合并所有部分(可能会到很多)的情况下解析格式错误的XML块,以获取有效的XML文档。这将为我节省多次查询数据库以检查块是否可用,并且我也不必合并数百个块才能使用前4000个字节。
我知道我可能可以使用Java的字符串函数来提取相关数据,但是是否可以使用解析器甚至XPath来实现此目的?或者它们都希望在解析XML之前将XML文档作为格式良好的文档进行解析?
1个回答

5
你可以尝试使用JSoup来解析无效的XML。按照定义,XML应该是格式良好的,否则它就是无效的,不应该被使用。 更新 - 示例:
public static void main(String[] args) {
    for (Node node : Parser.parseFragment("<test><author name=\"Vlad\"><book name=\"SO\"/>" ,
            new Element(Tag.valueOf("p"), ""),
            "")) {
        print(node, 0);
    }
}

public static void print(Node node, int offset) {
    for (int i = 0; i < offset; i++) {
        System.out.print(" ");
    }
    System.out.print(node.nodeName());
    for (Attribute attribute: node.attributes()) {
        System.out.print(", ");
        System.out.print(attribute.getKey() + "=" + attribute.getValue());
    }
    System.out.println();
    for (Node child : node.childNodes()) {
        print(child, offset + 4);
    }
}

谢谢 - 我认为这是特定于HTML文档的。我没有在处理HTML。 - ziggy
@ziggy:试试parseFragment()吧!看看我的更新。 - Vlad
啊哈..那很有趣。我会去看一下的。谢谢 - ziggy
1
您还可以执行类似于 Parser.parseBodyFragment(fragment, "").getElementsByTag("author") 这样的操作。 - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接