2

我正在使用 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

4 回答 4

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).

于 2011-05-03T17:00:06.603 回答
1

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

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

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

大多数主要的包管理器(apt、port 等)都会为它预先构建包。

于 2011-05-03T17:33:57.767 回答
1

$ grep -Hin "</\?user>" Text.xml将使用 或 打印出每一行。如果它们没有嵌套,那么您应该能够检查该输出并找到丢失的关闭标记(紧随其后时。脚本也会这样做:

https://gist.github.com/953837

这假设打开和关闭标签位于不同的行上。

于 2011-05-05T12:23:28.233 回答
0

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

我刚刚在其中粘贴了一个 15 mb 的 xml,并且很容易地修复了它。如果您有可能将其上传到某处,您也可以将 xml 作为 url 输入。Java 在某个地方报告了错误,看起来还不错,但是这个工具将实际错误本地化了,在更正之后,java 不再出错了。

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

于 2011-11-01T10:43:01.647 回答