最近做个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
分享到:
相关推荐
NULL 博文链接:https://zhaohong.iteye.com/blog/426761
jdom解析xml
jdom解析xml文件小实例jdom解析xml文件小实例jdom解析xml文件小实例
这是我做的简单的一个在jsp中用jdom解析xml的程序。只是显示,添加等简单的功能,来学习学习jdom解析xml的程序。如果你想学习那这一定是个很好的例子
一个关于用jdom解析xml,遍历xml,建立xml的简单例子.
NULL 博文链接:https://xurichusheng.iteye.com/blog/1518547
jdom解析xml文件的源代码、jar包以及示例xml文件
jdom处理xml例子
基于java的开发源码-用jdom解析xml.zip 基于java的开发源码-用jdom解析xml.zip 基于java的开发源码-用jdom解析xml.zip 基于java的开发源码-用jdom解析xml.zip 基于java的开发源码-用jdom解析xml.zip 基于java的开发...
Jdom查找XML文件的所有节点内容,一个简单的递归算法
JDOM 操作xml 解析读取xml文件 修改 删除 增添xml指定节点信息的XmlBean
jdom解析XML文件and把字符串解析成XML.txt jdom解析XML文件and把字符串解析成XML.txtjdom解析XML文件and把字符串解析成XML.txt
利用jdom读取xml 虽然是我自己写的 但是觉得有必要与大家分享一下
Java实现Jdom生成解析xml,一般可以用到存储数据。比如我以前做过的ERP系统,权限初始化就用的解析XML,但是现在上传的只是生成XML。如果哪位需要解析XML,留个言。。。。
利用JDOM解析xml文件,并根据xml中为类名,生成相应的对象。
org.jdom.adapters包含了与dom适配的java类 org.jdom.filter包含了xml文档的过滤器类 org.jdom.input包含了读取xml文档的类 org.jdom.output包含了写入xml文档的类 org.jdom.transform包含了将jdomxml 文档接口转换...
Java中使用jdom解析xml的案例, 以及文档说明。
这是一个jdom解析xml的小例子、里面还有dtd文件的编写以及dtd文件约束xml文件。这是一个jdom解析xml的小例子、里面还有dtd文件的编写以及dtd文件约束xml文件。这是一个jdom解析xml的小例子、里面还有dtd文件的编写...
在工作中发现jdom生成xml标签如<taxML xmlns:xsi="http://www.worg/2001/XMLSchema-instance" xsi:type="Fb1"cnName="附表1" name="Fb1"version="SW5001-2006"> 不能用冒号的问题root.setAttribute("xsi:type", "fb1...
对于含有子节点的复杂的XML文件,可以采用jdom.jar来解析。 上传的文件包括程序,XML文件,jdom包,jdbc包 对于复杂的XML文件,可以采用层层解析,虽然方法不是很简便,但是,可以完成解析的任务,而且,准确率很高...