Digester:元素类型“user”必须由匹配的结束标记“”终止

时间:2011-05-03 16:49:23

标签: java xml apache-commons-digester

我正在使用Digester来解析xml文件,我收到以下错误:

May 3, 2011 6:41:25 PM org.apache.commons.digester.Digester fatalError
SEVERE: Parse Fatal Error at line 2336608 column 3: The element type "user" must be terminated by the matching end-tag "</user>".
org.xml.sax.SAXParseException: The element type "user" must be terminated by the matching end-tag "</user>".

但是2336608是我的文本文件的最后一行。我想我正打开一个标签,我从不关闭它。你知道如何在大文本文件中找到并修复它吗?

感谢

4 个答案:

答案 0 :(得分:2)

编写另一个脚本来扫描该行的每个文件,每当找到一个打开的<user>标记时,递增一个计数器并打印

line number 1234 <user> opened (1 open total)

并且每当找到关闭</user>标记时,减少计数器打印

line number 4546 </user> closed (0 open total)

由于您还有一个开始标记而不是结束标记,因此该脚本的最终输出将告诉您1个标记保持打开状态。但是,假设您的XML模型不允许嵌套的<user>标记,那么您可以假设在您看到line number ... <user> opened (2 open total)的输出时出现问题声明。

答案 1 :(得分:1)

使用tidy -xml -e <your-xml-file>http://tidy.sourceforge.net/

Tidy是验证HTML的一个很好的小工具,在XML模式下(上面-xml)它也将验证XML。

它打印出解析错误的行号和列号。

大多数主要的包管理器(apt,port等)都有预先构建的包。

答案 2 :(得分:1)

$ grep -Hin "</\?user>" Text.xml将使用或打印出每一行。如果它们没有嵌套,那么你应该能够检查输出fand找到缺少的关闭标记(紧接着就是这样。一个脚本也是这样做的:

https://gist.github.com/953837

这假设open和close标签位于不同的行上。

答案 3 :(得分:0)

我认为没有必要启动脚本来检测xml错误。 例如,您可以使用w3 xml验证器 http://www.w3schools.com/xml/xml_validator.asp

我刚刚在那里粘贴了一个15 MB的xml,我设法很容易修复它。如果您可以将xml上传到某个地方,也可以将xml输入为url。 Java在某些地方报告错误似乎很好,但是这个工具本地化了实际的错误,在纠正之后,java不再出错了。

有许多类型的xml错误,并且都与嵌套结构无关,因此最好只使用一个众所周知的工具。例如,我的错误是一个参数错误(我错过了一个“),但是java检测到了一个嵌套问题。