java解析XML (JDOM & DOM4J,X-stream)(二)

来源:互联网 发布:办公软件好不好学 编辑:程序博客网 时间:2024/05/07 04:59

JDOM解析XML文件

JDOM 简化了与XML的交互并且比使用DOM实现更快,JDOM DOM主要有两方面不同,JDOM使用具体的类而不使用接口,这在某些方面简化了API,但是降低了灵活性

在使用时倒入相应的jar包。

具体步骤:

1:实例化一个合适的解析器:

SAXBuilder  builder = new SAXBuilder();

2:以包含XML数据的文件为参数,构建一个文档对象

Document doc =builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xiyou/Person.xml"));

3:获取根元素:

Element root = doc.getRootElement(); 

获取到根元素后,就可以很方便的对它的子元素进行操作了,如下为一些常用的方法

getChild("childname") 返回指定名字的子节点,如果同一级有多个同名子节点,则只返回第一个;如果没有返回null值。

getChildren("childname") 返回指定名字的子节点List集合。这样你就可以遍历所有的同一级同名子节点。

getAttributeValue("name") 返回指定属性名字的值。如果没有该属性则返回null,有该属性但是值为空,则返回空字符串。

getChildText("childname") 返回指定子节点的内容文本值。

getText() 返回该元素的内容文本值。

实例如下:

Xml文件与上一篇中的相同,

创建一个Person类,属性包含xml文件中的各个属性 此处省略(生成Seter Geter 方法 构造方法,toString方法等)

public class JDOMDemo {

public static void main(String[] args) {

 List<Person> list=parseJOMxml();

 System.out.println(list);

}

 

private static List <Person>  parseJOMxml() {

List<Person> list = new ArrayList<Person>();

SAXBuilder  builder = new SAXBuilder();

try {

Document doc =builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xiyou/Person.xml"));

Element root = doc.getRootElement(); //获取根结点

List <Element> es= root.getChildren();

for (int i = 0 ; i <es.size();i++){

Element e= es.get(i);

Person p = new Person();

p.setPersonid(e.getAttributeValue("personid"));

List <Element> presonNode =e.getChildren();

for (int j = 0 ;j< presonNode.size();j++){

Element node = presonNode.get(j);

String tag= node.getName(); // 获取标签的名字

if ("name".equals(tag)){

p.setName(node.getText());

}else if ("age".equals(tag)){

p.setAge(Integer.parseInt(node.getText()));

} else if ("sex".equals(tag)){

p.setSex(node.getText());

}else if ("tel".equals(tag)){

p.setTel(Long.parseLong(node.getText()));

}

}

list.add(p);

}

 

} catch (JDOMException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return list;

}

}

   DOM4J解析XML 文件

Dom4j 是一个非常优秀的java XML API ,具有性能优异,功能强大和易用的特性,在对主流的java XML API 进行性能,功能和易用性能测评,dom4j无论在哪个方面都是出色的,目前很多的java软件都在使用dom4来读写XML

Xml文件与上一篇中的相同,

创建一个Person类,属性包含xml文件中的各个属性 此处省略(生成Seter Geter 方法 构造方法,toString方法等)

实例如下:

public class DOM4Juse {

public static void main(String[] args) {

List <Person> list=parseDOM4jXML();

System.out.println(list);

}

private static List<Person> parseDOM4jXML() {

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xiyou/Person.xml");

/*SAXReader 相当于一个管道,用一个流的方式,把xml文件读出来

 * SAXReader reader = new SAXReader();

 * Document doc= reader.read(is);

 * 

 */

SAXReader reader = new SAXReader();

List <Person> list = new ArrayList<>();

try {

Document doc= reader.read(is);

Element root=  doc.getRootElement();//获取根结点

Iterator<Element > iter = root.elementIterator();//获取根结点下的子节点。

while (iter.hasNext()){

Element e=iter.next();

Iterator<Element> i = e.elementIterator();

Person p = new Person();

p.setPersonid(e.attributeValue("personid"));

while (i.hasNext()){

Element el = i.next();

String tag = el.getName();

if ("name".equals(tag)){

p.setName(el.getText());

}else if ("age".equals(tag)) {

p.setAge(Integer.parseInt(el.getText()));

}else if ("sex".equals(tag)){

p.setSex(el.getText());

}else if ("tel".equals(tag)){

p.setTel(Long.parseLong(el.getText()));

}

}

list.add (p);

}

 

} catch (DocumentException e) {

e.printStackTrace();

}

return list;

}

}

使用X-Stream解析xml

xStream可以轻易的将Java对象和xml文档相互转换的工具,很好很强大,提供可所有的基础类型,数组,集合,等类型直接转换的支持,

X-Stream对象相当于java对象和XML之间的转换器,转换过程是双向的,创建X-stream对象也很简单直接new即可。

转换也很方便可 java-xml 使用toXML();

XML -java ()使用fromXML()方法

在使用的时候应该首先导入jar

创建一个Person类,属性包含xml文件中的各个属性 此处省略(生成Seter Geter 方法 构造方法,toString方法等)

public class XstreamUse {

public static void main(String[] args) {

long num = 13993930987L;

Person p = new Person("1","杨根超",18,num,"man");

// 使用Xpp3作为解析器

XStream stream = new XStream(new Xpp3Driver());

stream.alias("person", Person.class);//取根标签别名

stream.useAttributeFor("personid",String.class );

String xml=stream.toXML(p);//java对象转换为XML

System.out.println(xml);

Person Per= (Person)stream.fromXML(xml);//XML转换为java对象

    System.out.println(Per);

}

}

总结各种总结方式的比较:

JDOM DOM在性能测试时,性能表现不佳,SAX表现较好(者要依赖于其特定的解析方式)DOM4J 性能最好,目前许多开源项目中大量采用DOM4J

 

0 0