我正在使用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是我的文本文件的最后一行。我想我正打开一个标签,我从不关闭它。你知道如何在大文本文件中找到并修复它吗?
感谢
答案 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检测到了一个嵌套问题。