我有一个使用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文档。这将节省我几次到数据库的行程,以检查一个块是否可用,并且我不必合并100个块只是为了能够使用前4000个字节。
我知道我可能会使用java的字符串函数来提取相关数据但是这可能是使用解析器甚至xpath吗?或者他们都希望xml文档在解析之前是一个格式良好的文档?
答案 0 :(得分: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);
}
}