[转]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
的方法,我们这里只需要关注:
第一个方法是SAX传给你的用于记录行号的帮助对象。在SAXHandler建立一个属性将
其保留在该类中。
这样我们就可以得到现在正在解析的行号了。
在看startDocument() ,发现他操作的是jdom中的Element,没办法了因为Element中没
有记录行号的属性我们就没有办法Element记录行号了(那时不可能的的)。接着看第二
步。
2.改造Element。上面说Element不能记录行号,Element的确是不能记录行号。但
是我们想办法让它可以记录行号。我的办法是,新建一个LineNumber类继承自Element
在这个类中添加一个属性lineNumber,用它来记录行号就可以了。
get,set方法一写。ok Element改造完了。
3.在回去开SAXHandler,第一步中说要关注两个方法。但是在哪里只说了setDocumentLocator
没有说另外一个。现在就说怎么改startElement。其实也很简单只要把
改为:
4.接下来就是怎么得到行号了。看代码:
完成。其实只是把jdom的Element的类型转换成LineNumber就可以得到行号了。
好了xml行号可以得到了。在这里只是用了软件工程中的 泛化 的概念。很简单
的实现了需求。
reference url: http://hi.baidu.com/guowei1651/blog/item/a7eb2b0897d561db62d986d9.html
最初想是不是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