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

Java 解析格式错误/不完整/无效的XML文件,java,xml,parsing,xpath,jdom,Java,Xml,Parsing,Xpath,Jdom,我有一个使用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 {

我有一个使用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字节而合并100个块

我知道我可能可以使用java的字符串函数来提取相关数据,但这是否可以使用解析器甚至xpath呢?或者他们都希望xml文档在解析之前是格式良好的文档吗

您可以尝试使用来解析无效的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);
    }
}
publicstaticvoidmain(字符串[]args){
对于(节点:Parser.parseFragment(“”,
新元素(Tag.valueOf(“p”),“”),
"")) {
打印(节点,0);
}
}
公共静态无效打印(节点,整数偏移){
对于(int i=0;i
谢谢-我认为这是特定于HTML文档的。我不使用HTML。@Zigy:试试parseFragment()!看我的更新。啊哈。。这很有趣。我去看看。谢谢你也可以做类似于
Parser.parseBodyFragment(fragment,”).getElementsByTag(“author”)