我有一个java程序,该程序分析的一个XML文件使用了xerces API。

我的分析类扩展的组织。apache.了xerces.分析程序.XMLDocumentParser,超载的startElement,endElement、字符的方法。

由于这是一个复杂的XML文件是手写的(主要是某种构成元素),经典的验证文件或dtd是不够的,而我需要回到用户的XML文件是无效的。

但是,1件事,我不可能实现的是增加信息中的错误消息有关的线路数量(和为什么不列数太),目前有其正在分析和错误的发生。

我的东西这可能是可能的,因为例外情况(org.apache.了xerces.xni.分析器。XMLParseException)分析器产生当XML文件是不是XML有效包含这些信息。

有帮助吗?

解决方案

我从来没有尝试过这种与了xerces,但萨克斯析器可以储存一个萨克斯风 定位器, ,你可以从中得到线和列的数字为该文件分析(或之后的一个例外)。

它看起来像 XMLDocumentParser 可能可以做同样的事情。其父类, AbstractXMLDocumentParser,有一个 startDocument 方法是通过一个 XMLLocator 参数。如果复盖这种方法,你可以保存 XMLLocator 并使用它 getLineNumbergetColumnNumber 方法。

其他提示

不知道“正确”的方法是什么,但看API,假设你提供XMLInputSource这需要一个InputStream或者是包裹着一个class LineNumberInputStream已或LineNumberReader,然后你可以在一个InputStream /读者提供一个阅读器进行查询对于行号。

例如:

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

我猜你也需要在class LineNumberInputStream已/ LineNumberReader传递给你的类,它扩展XMLDocumentParser。

不知道如果所有这一切都在你的代码是可行的。

或者深入到源,并找出他们是如何做到这一点。如果您需要访问的变量/方法是私有的,你不用担心你的代码在将来打破,你可以使用反射和删除访问权限得到它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top