当前位置: 首页 > 面试题库 >

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

狄宗清
2023-03-14
问题内容

我有一个使用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文档在解析之前是格式良好的文档?


问题答案:

您可以尝试使用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);
    }
}


 类似资料:
  • 问题内容: 目前,我正在开发一项功能,该功能涉及解析从另一产品收到的XML。我决定对一些实际的客户数据进行一些测试,看起来其他产品正在允许来自用户的输入被认为是无效的。无论如何,我仍然必须尝试找出一种解析它的方法。我们正在使用,但输入出现错误,如下所示。 如你所知,说明中包含似乎是无效标签的内容。现在,此描述标签被称为是叶子标签,并且其中不应包含任何嵌套标签。无论如何,这仍然是一个问题,并且会在

  • 我有以下错误:错误:(2)解析XML时出错:格式不正确(无效令牌) 错误:任务执行失败:应用程序:进程DebugResources。 com.android.ide.common.process.ProcessExcture:org.gradle.process.internal.ExecExc0019:进程'命令'E:\AndroidSdk\sdk\build-ols\23.0.2\aapt.e

  • 我需要将一个工作项目从Eclipse导入Android Studio 2.1,并从Gradle控制台收到以下消息 正在执行的任务:[:app:generateDebugSources,:app:mockableAndroidJar,:app:prepareDebugUnitTestDependencies,:app:generateDebugAndroidTestSources] 按需配置是一个孵

  • 我有XML数据在数据库(不是文件),我需要解析它,以提供可能写测试来验证数据在XML xml(内容数据): [致命错误]:14:2:根元素后面的文档中的标记必须格式良好。org.xml.sax.SaxParseException;亚麻编号:14;专栏编号:2;根元素后面的文档中的标记必须格式良好。位于com.sun.org.apache.xerces.internal.parsers.dompar

  • 到处都找不到。我已经找了一个多小时了,现在运气不佳。你看到了吗?

  • 目前,我正在研究一个涉及解析从另一个产品接收到的XML的特性。我决定针对一些实际的客户数据运行一些测试,看起来另一个产品允许应该被认为是无效的用户输入。不管怎么说,我还是得想出一个解析它的方法。我们正在使用,我在输入上得到一个错误,如下所示。 正如您所看到的,描述中有一个似乎无效的标记()。现在,这个描述标记是一个叶子标记,不应该有任何嵌套的标记。无论如何,这仍然是一个问题,并在上产生异常 我知道