欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[转]jdom得到xml标签行号 XMLSwingBlogF# 

程序员文章站 2022-03-17 12:17:50
...
      最近做个swing的xml操作工具。有个功能是要得到某个标签在xml文档中的行号。

      最初想是不是java解析xml的四种方法中的一种可以得到行号,就开始翻它们的

api,结果四种里面就sax可以得到行号就是那个locator类了。这种方法不太理想,

我不能想操作jdom或者dom4j中的 文档 对象一样简单的获得我想要的标签。


      所以,又翻了翻jdom的源程序,找到了SAXHandler这个类。这个类是jdom解析xml

使用的SAX的解析器。基本上就找到了jdom和SAX的结合处了。利用jdom和SAX结合来

解决这个问题就简单了。


      现在开始改造jdom让它符合我们的要求。


      1.改造SAXHandler。在SAXHandler中可以看到它实现了很到SAX的接口,基本和

我的功能不相干所以把它们全删掉(记得把它们的方法也删掉)。只留下DefaultHandler

的方法,我们这里只需要关注:

           
setDocumentLocator(org.xml.sax.Locator locator) ;

            startElement(String namespaceURI, String localName,

                               String qName, Attributes atts)

                               throws SAXException



第一个方法是SAX传给你的用于记录行号的帮助对象。在SAXHandler建立一个属性将

其保留在该类中。


setDocumentLocator(org.xml.sax.Locator locator) {                                                                

      this.locator = locator;

      super.setDocumentLocator(locator);

}



这样我们就可以得到现在正在解析的行号了。


在看startDocument() ,发现他操作的是jdom中的Element,没办法了因为Element中没

有记录行号的属性我们就没有办法Element记录行号了(那时不可能的的)。接着看第二

步。


      2.改造Element。上面说Element不能记录行号,Element的确是不能记录行号。但

是我们想办法让它可以记录行号。我的办法是,新建一个LineNumber类继承自Element

在这个类中添加一个属性lineNumber,用它来记录行号就可以了。


public class LineNumber extends Element {

       private int lineNumber;

}



get,set方法一写。ok Element改造完了。


      3.在回去开SAXHandler,第一步中说要关注两个方法。但是在哪里只说了setDocumentLocator

没有说另外一个。现在就说怎么改startElement。其实也很简单只要把


              
element = factory.element(localName, elementNamespace);


改为:

              
element = new LineNumber(localName, elementNamespace);

               ((LineNumber)element).setLineNumber(locator.getLineNumber());

好了。



      4.接下来就是怎么得到行号了。看代码:

public class JDom {
public static void main(String arge[]) {
   try {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    SAXHandler hand = new SAXHandler();
    sp.parse(new File("F:\\test.xml"), hand);
    Document doc = hand.getDocument();

    Element foo = doc.getRootElement();
    List allChildren = foo.getChildren();
    for (int i = 0; i < allChildren.size(); i++) {
     Element a = allChildren.get(x);
     System.out.print(a.getName() + ":"
        + a.getText()+" row="+((LineNumber)a).getLineNumber()+"\n");
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
}
}


完成。其实只是把jdom的Element的类型转换成LineNumber就可以得到行号了。


      好了xml行号可以得到了。在这里只是用了软件工程中的 泛化 的概念。很简单

的实现了需求。

reference url: http://hi.baidu.com/guowei1651/blog/item/a7eb2b0897d561db62d986d9.html