非常奇怪的一件事情:我已经在XML这个领域工作了快一年了。而且对于XML的各种规范,例如XML、Schema、Namespace、XSLT、XPath、XQuery,已经它们的最新进展都很熟悉了,各种规范中的犄角嘎拉的咚咚都比较了解了。但我却从来没有用流行的XML包(例如Xerces、JDOM、DOM4J等等)写过任何XML程序。
现在终于要写XML程序了,结果发现自己对于Xerces中的复杂类系统感到无所适从。我想实现这样一个功能:对于DOM中的每个Element,都能够记录它在源文件中的行号。但是这个要求好像有点高。看了Xerces的Mailing List,好像只有一个人提到了这个问题,它的解决方法是:
>
> >Is there a way to get the current number from the sax2 parser? Either
> >from the implementation of the DefaultHandler's beginElement or
> >endElement callbacks or from the object that has access the the
> >SAX2XMLReaderImpl object?
> >
> >Chris
> >
> >
> >
> I don't know if you've solved this already or not, but you can just
> implement setDocumentLocator from ContentHandler, and set the Locator a
> global variable.
> Then in startElement or endElement you just query the Locator. Easy as that.
我看了一下,XMLScanner类中的成员ReaderMgr实现了Locator接口。但我如何把这个成员像上面所说的那样,变成一个全局变量呢?难道修改Xerces的源代码?
另外,如何用SAXParser去实现一个DOM Tree呢?
另外,找到的方法就是JDOM,在JDOM-contrib中实现了一个LineNumberSAXBuilder和LineNumberElement,好像用它们可以很轻松的实现带行号信息的DOM Tree。
现在的问题就是用什么语言去实现了?如果用Java的话,JDOM显然很不错;而如果用C++的话,JDOM就不能用了。这样,就要去试Xerces的那种方法了。这个问题就不是我能决定的了,只有去问老板的意见了。