使用dom4j解析xml文档以及用XPath实现相关的操作

下面是要解析的xml文档里面的内容:


<?xml version="1.0" encoding="UTF-8"?>
<bookshelf>
	<book>
		<name>java编程思想</name>
		<price>78</price>
		<author>Eckel</author>
	</book>

	<book>
		<name look="good">设计模式</name>
		<price>80</price>
		<author>nothing</author>
	</book>
</bookshelf>


下面我们来用jdom4j来对这个文档进行解析:


public class Dom4jParseXml {
	private static Document doc;
	
	@BeforeClass
	public static void init() {
		try {
			SAXReader reader = new SAXReader();
			//解析xml文档,获取文档对象,将其加载到内存中
			doc = reader.read("src/book.xml");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 读取xml文档中<name look="good">设计模式</name>中的值,及其属性look的值
	 */
	@Test
	public void readXML() throws Exception {
		Element bookshelf = doc.getRootElement();
		Element book = (Element) bookshelf.elements("book").get(1);
		Element name = book.element("name");
		String nameValue = name.getText();
		String attValue = name.attribute("look").getValue();
		System.out.println("name的look属性值:" + attValue + ";name节点中的文本内容:" + nameValue);
	}
	
	/**
	 * 向xml文档的第一本书中添加这个<comment nothing="xxxx">非常好</comment>节点
	 * 并插入到<price>78</price>的后面
	 */
	@Test @SuppressWarnings("unchecked")
	public void addXML() throws Exception {
		Element book = doc.getRootElement().element("book");
		
		//这种方式是直接把节点追加到末尾
//		Element comment = book.addElement("comment");
//		comment.addAttribute("nothing", "xxxx").setText("非常好");
		
		//把将要加进去的元素创建出来
		Element comment = DocumentHelper.createElement("comment");
		comment.addAttribute("nothing", "xxxx").setText("非常好");
		//获取第一本书中所有的子节点,将其存入到List集合中
		List<Element> childNodes = book.elements();
		
		childNodes.add(2, comment);
		updateData();
	}
	
	/**
	 * 删除上面添加的节点
	 */
	@Test
	public void deleteXML() throws Exception {
		Element comment = doc.getRootElement().element("book").element("comment");
		comment.getParent().remove(comment);
		updateData();
	}
	
	/**
	 * 更新第一本书的价格
	 */
	@Test
	public void updateXml() throws Exception {
		doc.getRootElement().element("book").element("price").setText("1000");
		updateData();
	}

	/**
	 * 把更新在内存里的数据写回到xml文档里
	 * @throws Exception 
	 * @throws UnsupportedEncodingException 
	 */
	private void updateData() throws Exception {
		OutputFormat outformat = OutputFormat.createPrettyPrint();
		//为了防止中文乱码问题,输出器的字符集编码与xml文档的编码应该保持一致
		outformat.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "UTF-8"));
		writer.write(doc);
		writer.close();
	}
}

大家在拷贝代码的时候别忘记导入相应的包,以及添加一个dom4j的jar包。下面我将把上面的方法用XPath这个强大的功能来重新书写一遍,但是,还应该在导入一些jar包来支持这个功能,否则将会出现异常。如果想查看更多关于XPath的功能,具体请查看文档,需要jar包和文档的给我发邮件:[email protected]


public class Dom4jParseXml {
	private static Document doc;
	
	@BeforeClass
	public static void init() {
		try {
			SAXReader reader = new SAXReader();
			//解析xml文档,获取文档对象,将其加载到内存中
			doc = reader.read("src/book.xml");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 读取xml文档中<name look="good">设计模式</name>中的值,及其属性look的值
	 */
	@Test
	public void readXML() throws Exception {
		//使用XPath获取name节点属性look值为good的节点
		Element name = (Element) doc.selectSingleNode("//name[@look='good']");
		System.out.println("name的look属性值:" + name.attribute("look").getValue() + ";name节点中的文本内容:" + name.getText());
	}
	
	/**
	 * 向xml文档的第一本书中添加这个<comment nothing="xxxx">非常好</comment>节点
	 * 并插入到<price>78</price>的后面
	 */
	@Test @SuppressWarnings("unchecked")
	public void addXML() throws Exception {
		Element book = (Element) doc.selectSingleNode("/bookshelf/book[1]");
		
		//把将要加进去的元素创建出来
		Element comment = DocumentHelper.createElement("comment");
		comment.addAttribute("nothing", "xxxx").setText("非常好");
		//获取第一本书中所有的子节点,将其存入到List集合中
		List<Element> childNodes = book.elements();
		childNodes.add(2, comment);
		updateData();
	}
	
	/**
	 * 删除上面添加的节点
	 */
	@Test
	public void deleteXML() throws Exception {
		Element comment = (Element) doc.selectSingleNode("/bookshelf/book[1]/comment");
		comment.getParent().remove(comment);
		updateData();
	}
	
	/**
	 * 更新第一本书的价格
	 */
	@Test
	public void updateXml() throws Exception {
		doc.selectSingleNode("/bookshelf/book[1]/price").setText("1000");
		updateData();
	}

	/**
	 * 把更新在内存里的数据写回到xml文档里
	 * @throws Exception 
	 * @throws UnsupportedEncodingException 
	 */
	private void updateData() throws Exception {
		OutputFormat outformat = OutputFormat.createPrettyPrint();
		//为了防止中文乱码问题,输出器的字符集编码与xml文档的编码应该保持一致
		outformat.setEncoding("UTF-8");
		XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"), "UTF-8"));
		writer.write(doc);
		writer.close();
	}
}


你可能感兴趣的:(xml,dom4j,dom,乱码,xpath)