[转]jdom得到xml标签行号

最近做个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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值