zoukankan      html  css  js  c++  java
  • 使用DOM4J解析XML文档,以及使用XPath提取XML文档

    
    



    使用DOM4J解析XML文档

    需要首先下载DOM4J工具包。这是个第三方工具包

    在使用DOM4J解析的时候需要导入 DOM4J的JAR包

    下载DOM4J工具包-》在MyEclipse中新建lib文件夹-》在DOM4J中导入JAR包。可以全部导入,也可以导入指定的JAR包,这里我只导入dom4j jar,.--》 右键点击dom4jjar -》 Build Path -> add to Build Path -> 看见变成奶瓶后就导入成功了

    进行增删改查



    文档为:


    <?xml version="1.0" encoding="UTF-8"?>
    
    <书架> 
      <书> 
        <书名 name="xxxxx">第一本书</书名>  
        <作者>六道01</作者>  
        <售价>100</售价> 
      </书>  
      <书> 
        <书名>第二本书</书名>  
        <作者>六道02</作者>  
        <售价>200</售价> 
      </书> 
    </书架>



    程序为:


    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import org.junit.Test;
    
    //使用dom4j解析XML文档
    public class Demo1
    {
    	// 读取XML第二本书的: <书名>第二本书</书名>
    	// 读取!!
    	@Test
    	public void read() throws Exception
    	{
    		// 获得document
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(new File("src/MyBook.xml"));
    
    		// 获得根节点
    		Element root = document.getRootElement();
    		// 通过elements获得 素有包含书的标签的 文档,并再获得第二个标签的书 get(1);
    		// 需要强转 因为通过elements获得的是list集合 里面是object 类型
    		Element book = (Element) root.elements("书").get(1);
    		// 获得书里面的内容
    		String value = book.element("书名").getText();
    		System.out.println(value);
    
    		// 获得里面的属性的值
    		// 第一本书才有属性 所以get(0)
    		Element book2 = (Element) root.elements("书").get(0);
    		// 获得书里面的内容
    		String value2 = book2.element("书名").attribute("name").getValue();
    		System.out.println(value2);
    
    	}
    
    	// 写入
    	// 在第一本书上添加一个新的售价 :<售价> 250元 </售价>
    	// 写入的时候注意编码的问题 默认使用GB2312
    	@Test
    	public void add() throws DocumentException, IOException,
    			FileNotFoundException
    	{
    		// 获得document
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(new File("src/MyBook.xml"));
    
    		Element book = document.getRootElement().element("书");
    		book.addElement("售价").setText("250元");
    
    		// 格式化输入器。 createPrettyPrint创建漂亮的格式化输入器
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		// 文档是什么类型格式化输入器就是什么类型
    		format.setEncoding("UTF-8");
    
    		// 更新XML文档 ,将内存中数据写入XML文档当中去
    		// 这里用的是字节流,用字符流的话不会查码表,如果写入和输出的编码不一样则会乱码
    		// 用字节流会查自己提供的码表。
    		XMLWriter writer = new XMLWriter(
    				new FileOutputStream("src/MyBook.xml"), format);
    		// 开始写入
    		writer.write(document);
    		writer.close();
    
    	}
    
    	// 在一本书的指定的位置添加售价:<售价> 350元 </售价>  只要更改保存了所有孩子的list集合的顺序
    	@Test
    	public void add2() throws DocumentException, IOException,
    			FileNotFoundException
    	{
    		// 获得document
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(new File("src/MyBook.xml"));
    
    		// 得到书的标签
    		Element book = document.getRootElement().element("书");
    		// 将获得的书的标签存入 list集合
    		// list集合中的集合的样子是:[书名,作者,售价] 现在在售价前面添加售价
    		List list = book.elements();
    
    		// 获得售价
    		Element price = DocumentHelper.createElement("售价");
    		// 设置售价内容
    		price.setText("350元");
    
    		// 第二个[书名,作者,售价,售价]
    		list.add(2, price);
    
    		// 将内存中document写入xml文档
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8");
    
    		XMLWriter writer = new XMLWriter(
    				new FileOutputStream("src/MyBook.xml"), format);
    		// 开始写入
    		writer.write(document);
    		writer.close();
    
    	}
    	
    	
    	//删除 上面add2添加的售价节点
    	@Test
    	public void delete() throws DocumentException, Exception
    	{
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(new File("src/MyBook.xml"));
    		
    		//获得售价标签
    		Element price = document.getRootElement().element("书").element("售价");
    		//删除售价
    		price.getParent().remove(price);
    		
    		//更新XML文档
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8");
    
    		XMLWriter writer = new XMLWriter(
    				new FileOutputStream("src/MyBook.xml"), format);
    		// 开始写入
    		writer.write(document);
    		writer.close();
    	}
    	
    	//更新数据 改变第二本书的作者
    	@Test
    	public void updata() throws Exception
    	{
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(new File("src/MyBook.xml"));
    		
    		Element book = (Element) document.getRootElement().elements("书").get(1);
    		book.element("作者").setText("六道03");
    		
    		
    		//更新数据
    		OutputFormat format = OutputFormat.createPrettyPrint();
    		format.setEncoding("UTF-8");
    
    		XMLWriter writer = new XMLWriter(
    				new FileOutputStream("src/MyBook.xml"), format);
    		// 开始写入
    		writer.write(document);
    		writer.close();
    	}
    	
    	
    
    }
    




    ****************************************************************************邪恶的分割***********************************************************************************************



    下面使用XPath提取XML文档 

    需求:在XML文档中有用户名密码,现在编程定义用户名密码 ,测试用户名密码是否匹配,如果存在并匹配,那么打印登陆成功,如果不匹配,那么打印登陆失败。


    xml文档:


    <?xml version="1.0" encoding="UTF-8"?>
    <users>
    	<user id = "1" username = "aaa" password = "123" email="123@sina.com"/>
    	<user id = "2" username = "bbb" password = "456" email="456@sina.com"/>
    </users>
    



    程序:

    import java.io.File;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Node;
    import org.dom4j.io.SAXReader;
    
    public class FindUsers
    {
    	/**
    	 * 查找users.xml文档是否有和用户匹配的用户名和密码
    	 * 
    	 * @param args
    	 * @throws Exception
    	 */
    	public static void main(String[] args) throws Exception
    	{
    		String username = "aaa";
    		String password = "123";
    
    		// 检测xml文档中是否有匹配的
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(new File("src/users.xml"));
    
    		// 使用XPath解析XML文档, 查找用户名和密码是否相匹配
    		//注意在这里 等于用户名和密码时 用到单引号
    		Node node = document.selectSingleNode("//user[@username = '" + username
    				+ "' and @password = '" + password + "' ]");
    		if(node==null)
    		{
    			System.out.println("用户名或密码错误");
    		}
    		else
    		{
    			System.out.println("恭喜登陆成功");
    		}
    
    	}
    
    }
    






  • 相关阅读:
    20145127 《Java程序设计》第一周学习总结
    Java 问卷调查
    一个没有成就而即将退赛的OIer的告别书
    【深度优先搜索】MZOJ_1344工作依赖
    【算法随笔】最小生成树
    【数据结构】二叉树 学习笔记1
    【深度优先搜索】NOIP2017_D2T1 洛谷3958奶酪
    【树形DP】MZOJ_1063_士兵守卫
    【算法随笔】写一个自己的名词空间
    【树形DP】洛谷1122_最大子树和
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3181446.html
Copyright © 2011-2022 走看看