`
goalietang
  • 浏览: 26231 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

XML 解析(二) JDOM, DOM4J,Digester

阅读更多
        延续XML解析的几种方式(一)的代码格式,我们来写一个用JDOM解析XML的方法,这个方法首先依赖于外部包org.jdom。让我们仔细看看代码,知道他解析XML的简单和效率。
public class ExecuteXMLwithJDOM implements XMLExecutor {
        //JDOM创建XML
	public void createXML(String fileName) {
		Document document;
		Element root;
		root = new Element("employees");
		document = new Document(root);
		
		Element employee1 = new Element("employee");
		root.addContent(employee1);
		Element name1 = new Element("name");
		name1.setText("tangsir");
		employee1.addContent(name1);
		Element sex1 = new Element("sex");
		sex1.setText("m");
		employee1.addContent(sex1);
		Element age1 = new Element("age");
		age1.setText("31");
		employee1.addContent(age1);
		
		Element employee2 = new Element("employee");
		root.addContent(employee2);
		Element name2 = new Element("name");
		name2.setText("tangsir");
		employee2.addContent(name2);
		Element sex2 = new Element("sex");
		sex2.setText("m");
		employee2.addContent(sex2);
		Element age2 = new Element("age");
		age2.setText("31");
		employee2.addContent(age2);
		
		XMLOutputter XMLOut = new XMLOutputter();
		try {
			XMLOut.output(document, new FileOutputStream(fileName));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
        //JDOM解析XML
	public void parseXML(String fileName) {
		SAXBuilder sb = new SAXBuilder();
		Document doc;
		Element root = null;
		try {
			doc = sb.build(fileName);
			// 获取XML根节点,这里的根节点是employees
			root = doc.getRootElement();
		} catch (JDOMException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
		// 获取根节点的一级子节点列表
		List list = root.getChildren("employee");
		for (int i = 0; i < list.size(); i++) {
			Element e = (Element) list.get(i);
			System.out.println(e.getChild("name") + "  =  "
					+ e.getChildText("name"));
			System.out.println(e.getChild("sex") + "  =  "
					+ e.getChildText("sex"));
			System.out.println(e.getChild("age") + "  =  "
					+ e.getChildText("age"));
		}
	}
}

         就这么简单,我们就实现了之前很多行代码的XML的解析,根据不要重复造轮子的经验,我们没必要自己再写个什么东西来解析XML,就用现成的JDOM包,两三句代码就搞定一个XML解析了。写入XML快,解析XML更快,痛快吧,童鞋们!

         为减少DOM、SAX的编码量,JDOM才出现的;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX。

         也许你要说JDOM已经很方便了,但是趁热打铁,让我们再上一段DOM4J的代码
public class ExecuteXMLwithDOM4J implements XMLExecutor {

	public void createXML(String fileName) {
		Document document = DocumentHelper.createDocument();
		Element employees = document.addElement("employees");
		//add tangsir info into document
		Element employee1 = employees.addElement("employee");
		Element name1 = employee1.addElement("name");
		name1.setText("tangsir");
		Element sex1 = employee1.addElement("sex");
		sex1.setText("m");
		Element age1 = employee1.addElement("age");
		age1.setText("31");
		//add jianqiangsir info into document
		Element employee2 = employees.addElement("employee");
		Element name2 = employee2.addElement("name");
		name2.setText("jianqiangsir");
		Element sex2 = employee2.addElement("sex");
		sex2.setText("fm");
		Element age2 = employee2.addElement("age");
		age2.setText("30");
		try {
			Writer fileWriter = new FileWriter(fileName);
			XMLWriter xmlWriter = new XMLWriter(fileWriter);
			xmlWriter.write(document);
			xmlWriter.close();
		} catch (IOException e) {

			System.out.println(e.getMessage());
		}
	}

	public void parseXML(String fileName) {
		File inputXml = new File(fileName);
		SAXReader saxReader = new SAXReader();
		try {
			Document document = saxReader.read(inputXml);
			Element employees = document.getRootElement();
			for (Iterator i = employees.elementIterator(); i.hasNext();) {
				Element employee = (Element) i.next();
				for (Iterator j = employee.elementIterator(); j.hasNext();) {
					Element node = (Element) j.next();
					System.out.println(node.getName() + ":" + node.getText());
				}
			}
		} catch (DocumentException e) {
			System.out.println(e.getMessage());
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("dom4j parserXml");
	}
}

        怎样,dom4j是不是又让你眼前一亮菊花一紧? 如此方便的XML解析包。如此简单的代码,几句话将一个XML文件给解析出来。DOM4J的代码,我没有加一句注释,其实不需要注释你也应该很容易看出来每一步在做什么,真实的实现了所见即所得。

        DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。

        这里,我还要给大家介绍一种方便的XML解析方法,这种方法更符合面向对象的编码原则,更容易让Java程序员所理解,就是Apache所推出的Digester的解析方式,这种方式需要依赖于commons-digester和commons-collections包。代码如下:

        首先我们定义一个Employee类,这个类中的属性就是XML中Employee标签下的字段。这个类很简单,就是个简单的javabean,有getter,setter方法和一个无参构造方法。
public class Employee {
	private String name;
	private String sex;
	private int age;
	
	public Employee() {
		
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

        然后定义一个Employees类,这个类中只有一个ArrayList成员变量,该成员变量中存储的就是每个Employee对象。我们在代码中也给出了添加对象和获取List中对应Employee的方法,代码如下:
public class Employees {
	private ArrayList elist;
	
	public Employees(){
		elist = new ArrayList();
	}
	public void addEmployee(Employee stu){
		elist.add(stu);
	}
	public Employee getEmployee(int i){
		return (Employee) elist.get(i);
	}
}
in
        有了这两个对象对应XML的两个主要节点,我们就可以开始写Digester解析代码了
public class ParseXMLwithDigester {
	
	public void parseXML(String fileName) {
		Digester digester = new Digester();
		digester.addObjectCreate("employees", Employees.class);
		   digester.addObjectCreate("employees/employee", Employee.class);
		      digester.addBeanPropertySetter("employees/employee/name","name");
		      digester.addBeanPropertySetter("employees/employee/sex","sex");
		      digester.addBeanPropertySetter("employees/employee/age","age");
		    digester.addSetNext("employees/employee", "addEmployee"); 
			try {
				Employees employs = (Employees) digester.parse(new File(fileName));
				Employee emp = employs.getEmployee(0);
	System.out.println(emp.getName()+ ""+ emp.getSex()+""+ emp.getAge());
				Employee emp2 = employs.getEmployee(1);
	System.out.println(emp2.getName()+ ""+ emp2.getSex()+""+ emp2.getAge());
				}catch(Exception e){
					e.printStackTrace();
				}
	}
}

        从上面的代码中可以看出,Digester是将XML标签映射成实际的javabean,然后通过他自身的几个简单方法将其封装成一定结构的树来解析的。该方法容易被面向对象开发者所理解,但是如果XML过于复杂的话,会产生很多映射对象,开销也相应的增大了。

        注意: 以上几段代码中(除了Digester)都出现过Element,Document等等字段,我们使用DOM的时候就需要引入DOM包下面的这些字段,使用JDOM的时候需要引入JDOM包下面的这些字段,使用DOM4J的时候引入的应该是DOM4J包下面的这些字段,不要引入错误,导致编译都通不过哟。

        最后,同样贴出测试代码
	public static void main(String[] args) {
		//JDOM解析XML测试
		ExecuteXMLwithJDOM jdom = new ExecuteXMLwithJDOM();
		jdom.createXML("C:\\gggg.xml");
		jdom.parseXML("C:\\gggg.xml");
		//DOM4J解析MXL测试
		ExecuteXMLwithDOM4J dom4j = new ExecuteXMLwithDOM4J();
		dom4j.createXML("C:\\xxxx.xml");
		dom4j.parseXML("C:\\xxxx.xml");
		//Digester解析XML测试
		ParseXMLwithDigester digs = new ParseXMLwithDigester();
		digs.parseXML("C:\\xxxx.xml");
	}
}

        最后附上XML解析需要用到的包,大家可以尝试一下方便的解析了!
分享到:
评论

相关推荐

    digester解析xml的问题.pdf

    此外,虽然 Digester 提供了一种方便的方式来映射 XML 到 Java 对象,但它的灵活性和可维护性相比现代的 XML 解析技术(如 JAXB、JDOM、DOM4J 或 Stax)可能会稍逊一筹。在大型项目中,更推荐使用这些现代库来处理 ...

    Commons-digesterXML解析Demo

    然而,Digester是基于规则的解析器,它结合了DOM和SAX的优点,允许开发者通过定义匹配规则将XML元素映射到Java对象的属性或方法。 2. **Apache Commons Digester库** Digester库的核心概念是规则(Rules),这些...

    java 操作xml文件(包含xml文件和对应jar包)

    在描述中提到了一个用于操作XML的jar包,这可能是指如JDOM、DOM4J、Apache Commons Digester或Woodstox等第三方库。这些库提供了更高级别的抽象,使得XML操作更加便捷。例如,JDOM和DOM4J是对DOM API的简化和增强,...

    Java xml转化为map

    要实现XML到Map的转换,我们可以使用Java的标准库JAXB(Java Architecture for XML Binding)或者第三方库如DOM4J、JDOM、Apache Commons Digester等。这里我们主要讨论使用JAXB的方法,因为它是Java平台的一部分,...

    xml操作的例子

    - DOM4J:一个流行的Java XML库,提供了丰富的API,支持XML解析、创建和修改,以及XPath查询。 4. XML序列化 - 将Java对象转换为XML的过程称为序列化。JAXB提供了`unmarshal` 方法将XML反序列化为Java对象,反之...

    JOX实现XML和JavaBean相互转化

    XML和JavaBean相互转化是一个非常有用的工作,用来读写xml的组件很多,比如dom4j, sax, JDom,Digester等,但是很多组件用起来很麻烦,今天给大家推荐一个超级简单的组件JOX, JOX是一套用户XML document和Java ...

    java操作xml相关jar

    7. **DOM4J** 和 **JDOM**:这两个是Java社区开发的第三方XML库,提供了比Java标准库更友好的API。它们支持DOM、SAX和StAX,并且提供了额外的功能,如XPath查询和XML编写。 8. **Woodstox** 和 **Aalto-XML**:这两...

    java xml realworld problem

    - DOM4J:提供了比JDOM更丰富的功能,如XPath查询。 3. XML Schema(XSD)与DTD(文档类型定义): - XSD用于定义XML文档的结构和数据类型,支持复杂的数据模型。 - DTD更简单,但不支持数据类型,适用于简单的...

    xml在java中的l实例

    - DOM4J:提供了更简洁的API来处理XML,支持DOM、SAX和StAX。 - JDOM:专为Java设计的DOM实现,简化了API。 - Apache Commons Digester:用于将XML输入映射到Java对象。 10. **XML的安全性** - 为了避免XML注入...

    很好的操作xml文件的应用

    在Java中,处理XML文件有多种方式,包括SAX(Simple API for XML)、DOM(Document Object Model)和DOM4J、JAXB(Java Architecture for XML Binding)等。SAX是事件驱动的解析器,适用于大文件,因为它只需要一次...

    RepMaven.zip

    5. **dom4j**:DOM4J是一个Java的XML API,提供了DOM、SAX和JDOM等多种处理XML的方式,并且支持XPath查询。 6. **xpp3**:XPP3是XML Pull解析器的版本3,它是轻量级的XML解析器,适用于处理大量XML数据的场景。 7....

    web开发常用jar

    Hibernate使用dom4j解析XML配置文件和XML映射元文件。必需的。 ehcache-1.2.jar Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 ...

    maven依赖库 - maven_repository.zip

    4. **wsdl4j**:这是一个用于处理WSDL(Web Services Description Language)文档的Java库。它提供了读取、写入和操作WSDL文件的能力,是开发和调试Web服务的重要工具。 5. **.locks**:这个目录可能包含了Maven...

    java开发常用jar包

    Hibernate使用dom4j解析XML配置文件和XML映射元文件。必需的。 ehcache-1.2.jar Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache缓存工具。如果没有其它的可选缓存工具,则为必需的。 ...

    Ireport所需要的包

    5. **XML解析库**:如jaxen-x.x.x.jar和dom4j-x.x.x.jar,用于解析XML文档。Ireport在处理报表模板时,可能会涉及到XML的读写和操作,这些库起到了关键作用。 6. **iText**:iText-x.x.x.jar是用于PDF生成的库,它...

    Validator:验证您的 PGM XML

    2. **SAX(简单API for XML)解析**:与DOM不同,SAX是事件驱动的解析器,逐行读取XML文件,只处理需要的部分,适合处理大型XML文件。 3. **JAXB(Java Architecture for XML Binding)**:用于在Java对象和XML之间...

    jxsl所需jar

    5. **jdom.jar**:Java DOM(Document Object Model)库用于解析和操作XML文档。在JXSL中,可能需要使用JDOM来处理输入的数据源,以便转换成Excel格式。 6. **commons-jexl-1.0.jar**:Apache Commons JEXL(Java ...

Global site tag (gtag.js) - Google Analytics