我有一个使用xerces API解析XML文档的java程序。
我的解析类扩展了org.apache.xerces.parsers.XMLDocumentParser,重载了startElement,endElement,characters方法。
由于它是一个手工编写的复杂XML文档(主要是某种配置元素),xsd或dtd的经典验证是不够的,我必须向用户返回XML文档无效。< / p>
但我无法实现的一件事是在错误消息中添加有关当前正在解析的行号(以及为什么不是列号)的信息以及错误发生的位置。
我认为这是可能的,因为当XML文档不是XML有效时,解析器生成的异常(org.apache.xerces.xni.parser.XMLParseException)包含这些信息。
答案 0 :(得分:5)
我从未尝试使用xerces,但是SAX解析器可以存储SAX Locator,您可以在解析文档时(或者在异常之后)从中获取行号和列号。
看起来XMLDocumentParser
可能会做同样的事情。其父类AbstractXMLDocumentParser
具有startDocument方法,该方法传递XMLLocator
参数。如果您覆盖此方法,则可以保存XMLLocator
并使用其getLineNumber
和getColumnNumber
方法。
答案 1 :(得分:1)
不确定“正确”的方式是什么,但是看看API,假设您提供的XMLInputSource采用InputStream或Reader,您可以在一个包含LineNumberInputStream或LineNumberReader的InputStream / Reader中提供,然后查询它对于行号。
例如:
InputStream stream; stream = ...; new XMLInputSource(stream);
会变成:
InputStream stream; LineNumberInputStream lineStream; stream = ...; lineStream = new LineNumberInputStream(lineStream); new XMLInputSource(lineStream); // can now ask the line stream what line it is on via getLineNumber()
我猜你还需要将LineNumberInputStream / LineNumberReader传递给扩展XMLDocumentParser的类。
不确定您的代码中是否所有这些都可行。
或者深入了解来源并了解他们是如何做到的。如果您需要访问的变量/方法是私有的,并且您不担心将来的代码中断,您可以使用反射并删除访问权限以获取它。