JAVA(十九)Dom4j

DOM4J介绍

DOM4J是dom4j.org出品的一个开源的XML解析包。DOM4J应用于Java平台,采用lJava集合框架并完全支持DOM、SAX和JAXP。

DOM4J使用非常简单。只要了解基本的XML-DOM模型,就能使用。

Dom:把一个文档作为一个对象。

DOM4J最大的特点是使用大量的接口,他的主要接口都在org.dom4j里面定义。

接口名定义
Atribute定义了XML的属性
Branch指能够包含字节点的节点。如XML元素(Element)和文档(Document)定义了一个公共的行为
CDDATA定义了XML CDATA区域
CharacterData是一个标识接口,标识基于字符的节点。如CDATA、Comment、Text
Comment定义了XML注释的行为
Document定义了XML文档
DocumentType定义了XML DOCTYPE声明
Element定义了XML元素
ElementHandler定义了Element对象的处理器
ElementPath被ElementHandler使用,用于取得当前正在处理的路径层次信息
Entity定义了XML Entity实例
Node为dom4j中所有的XML节点定义了多态行为
NodeFilter定义了在dom4j节点产生的一个滤镜或谓语的行为(predicate)
ProcessingInstruction定义了XML处理指令
Text定义; XML文本节点
Visitor用于实现Visitor
XPath在分析一个字符串后提供了一个XPath表达式

各接口的继承关系如下:

  • interface java.lang.Cloneable
    • interface org.dom4j.**Node
      • interface org.dom4j.Attribute
      • interface org.dom4j.Branch
      • interface org.dom4j.Document
      • interface org.dom4j.Element
      • interface org.dom4j.CharacterData
        • interface org.dom4j.CDATA
        • interface org.dom4j.Comment
        • interface org.dom4j.Text
      • interface org.dom4j.DocumentType
      • interface org.dom4j.Entity
      • interface org.dom4j.ProcessingInstruction

XML 文档操作

XML:是一种简单的基于文本的语言,它被设计为储存和运输以纯文本格式的数据,XML标签可以自己定义。

读取XML文档

读写XML额外拿的那个主要依赖于org.dom4j.io包,有DOMReaderSAXReader两种方式。因为利用了相同的接口,他们的调用方式是一样的。

public static Document load(String filename){
  Document doc = null;
  try{
    SAXReader reader = new SAXReader();
    doc = reader.read(new File(filename));
  }catch(Exception e){
    e.printStackTrace;
  }
  return doc;
}
public static Document load(URL url){
  Document doc = null;
  try{
    SAXReader reader = new SAXReader();
    doc = reader.read(url));
  }catch(Exception e){
    e.printStackTrace;
  }
  return doc;
}

读取指定的XML文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Dom操作。执照XML文件头所定义的编码来转换。

获取根结点

根结点是XML分析的开始,任何XML分析工作哦度需要从 根开始。

SAXReader reader = new SAXReader();
Document doc = reader.read(new File("filename"));
//获取根节点
Element element = doc.getRootElement();

增删改查

增加节点

//实例:
public static void main(String[] args) throws Exception {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入添加书的简称:");
		String Jname = sc.next();
		System.out.println("请输入添加书的id:");
		String id = sc.next();
		System.out.println("请输入添加书的name:");
		String name = sc.next();
		
		//将xml文件转为Doc对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("filename"));
		
		//获取根节点
		Element element = doc.getRootElement();
		
		//在根结点上添加新的book节点
		Element newbook = element.addElement("book");
		newbook.addAttribute("name", Jname);
		
		//在book节点中添加数据
		Element newid = newbook.addElement("id");
		newid.setText(id);
		
		Element newname = newbook.addElement("name");
		newname.setText(name);
		
		//保存
		try {
			OutputFormat of =OutputFormat.createCompactFormat();
			of.setEncoding("uft-8");
			XMLWriter writer = new XMLWriter(new FileWriter(new File("filename")));
			writer.write(doc);
			writer.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
		sc.close();
	}

删除节点

//实例:
public static void main(String[] args) throws Exception{
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要删除的节点:");
		String findname = sc.next();
		
		//将XML文件转为Doc对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("filename"));
		
		//获取根结点
		Element element = doc.getRootElement();
		Iterator<?> iterator = element.elementIterator();
		while(iterator.hasNext()) {
			Element element1 = (Element) iterator.next();
			if(findname.equals(element1.attributeValue("name"))) {
				Element ele = element1;
				ele.getParent().remove(ele);
			}
		}
		//保存
		try {
			OutputFormat of = OutputFormat.createPrettyPrint();
			of.setEncoding("utf-8");
			XMLWriter writer = new XMLWriter(new FileWriter("filename"),of);
			writer.write(doc);
			writer.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		sc.close();
	}

更改节点

//实例
public static void main(String[] args) throws Exception {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要修改书的简称:");
		String findname = sc.next();
		
		//将XML文件转为doc对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("filename"));
		
		//获取根结点
		Element element = doc.getRootElement();
		Iterator<?> iterator = element.elementIterator();
		while(iterator.hasNext()) {
			//获取字节节点
			Element element1 = (Element)iterator.next();
			if(findname.equals(element1.attributeValue("name"))) {
				//定义新的节点
				Element ele = element1;
				//创建用于存放数据的list集合
				@SuppressWarnings("unchecked")
				List<Element> list = ele.elements();
				if(list!=null) {
					System.out.println("1.编号	2.书名");
					System.out.println(list.get(0)+"	"+list.get(1));
				}else {
					System.out.println("查无此书"+findname);
				}
				//查到相应书籍
				System.out.println("请输入需要修改的序号");
				int num = sc.nextInt();
				if(num==1) {
					System.out.println("请输入新的id:");
					list.get(0).setText(sc.next());
				}else {
					System.out.println("请输入新的name:");
					list.get(1).setText(sc.next());
				}
			}
		}
		//保存
		try {
			OutputFormat of = OutputFormat.createPrettyPrint();
			of.setEncoding("utf-8");
			XMLWriter writer;
			writer = new XMLWriter(new FileWriter("filename"));
			writer.write(doc);
			writer.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
		sc.close();
	}

查看节点

//实例
public static void main(String[] args) throws Exception {
//定义list集合用来存储数据
		ArrayList<Book> bookslist = new ArrayList<Book>();
		
		//将XML文件封装为doc对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("filename"));//此处将抛出异常
		
		//获取doc对象的字节点
		Element element = doc.getRootElement();
		//迭代器
		Iterator<?> iterator = element.elementIterator();
		while(iterator.hasNext()) {
			//获取字节点
			Element element1 = (Element)iterator.next();
			Book book = new Book();
			Iterator<?> iterator1 = element1.elementIterator();
			while(iterator1.hasNext()) {
				Element element2 = (Element)iterator1.next();
				//获取字节点的相关信息
				if("id".equals(element2.getName())) {
					//get.Text():获取相关数据,此处需要转型
					book.setId(Integer.parseInt(element2.getText()));
				}else if("name".equals(element2.getName())) {
					book.setName(element2.getText());
				}
			}bookslist.add(book);
		}
  	//遍历
		for(Book book : bookslist) {
			System.out.println(book.getId()+"	"+book.getName());
		}
	}

Document对象相关

  • 读取XML文件,获取Document对象

    SAXReader reader = new SAXReader();
    Document doc = new reader.read(new File("filename"))
    
  • 解析XML形式的文本,得到document对象

    String text = "<members></members>"
    Document doc =DocumentHelper.praseText(text);
    
  • 主动创建document对象

    Document doc = DocumentHelper.createDocument();
    Element root = document.addElement("members");
    

节点相关

  • 获取文档的根节点

    Element rootele = document.gerRootElement();
    
  • 获得某节点的单个子节点

    Element memberele = root.element("member");
    
  • 取得节点的文字

    String text = memberele.getText();
    //取得根结点下的name节点的文字
    String text = root.elementText("name");
    
  • 取得某节点下指定名称的所有节点并进行遍历

    List nodes = rootele.elements("member");
    for(Iterator it = nodes.iterator(); it.hasNext();){
      Element ele = (Element)it.next();
    }
    
  • 对某节点下的所有子节点进行遍历

    for(Iterator it = root.elementIterator(); it.hasNext();){
      Element elemetn = (Element) it.next();
      //do something
    }
    
  • 某节点下添加子节点

    Element ageele = newMemberEle.addElement("age";)
    
  • 设置节点文字

    ageele.setText("12");
    
  • 删除某节点

    parentele.remove(childele);//parentele是父节点,childele是呆删的子节点
    
  • 添加一个CDATA节点

    Element contentele = infoele.addElement("contect");
    contectele.addCDARA(diary.gerContect());
    

属性相关

  • 取得节点的指定的属性

    Element root = document.getRootElement();
    Attribute attribute = root.attribute("size");
    
  • 取得属性的文字

    String text = attribute.getText();
    //获取根结点下name子节点的firstname属性的值
    String text2 = root.element("name").attributeValue("firstname");
    
  • 遍历某节点的所有属性

    Element root = document.getRootElement();
    for(Iterator it = root.attributeIterator(); it.hasNext();){
      Attribute attribute = (Attribute) it.next();
      String text = attribute.getText();
      System.out.println(text);
    }
    
  • 设置某节点的属性和文字

    newMemberElm.addAttribute("name", "sitinspring");   
    
  • 设置属性的文字

    Attribute attribute=root.attribute("name");      
    attribute.setText("sitinspring");      
    
  • 删除某属性

    Attribute attribute=root.attribute("size");// 属性名name      
    root.remove(attribute);   
    

将文档写入XML文件

  • 文档中全为英文,不设置编码,直接写入

    XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));      
    writer.write(document);      
    writer.close();  
    
  • 文档中含有中文,设置编码格式再写入

    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setEncoding("GBK");    // 指定XML编码
    XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
    writer.write(document);
    writer.close();
    

字符串与XML的转换

  • 字符串与XML的转换

    String text = "<members> <member>sitinspring</member> </members>";      
    Document document = DocumentHelper.parseText(text);   
    
  • 将文档或节点的XML转化为字符串

    AXReader reader = new SAXReader();
    Document document = reader.read(new File("input.xml"));
    Element root=document.getRootElement();
    String docXmlText=document.asXML();
    String rootXmlText=root.asXML();
    Element memberElm=root.element("member");
    String memberXmlText=memberElm.asXML();
    

     

DOM4J的类和接口

类:SAXReader

当解析到path指定的路径时,将调用参数handler指定的处理器。正对不同的节点可以添加多个handler实例。或者调用默认的HandlersetDefaultJandler(ElementHandler handler);

接口:ElementHandler

该方法在解析到元素的开始、结束标签时被调用。

接口:ElementPath

该方法与SAXReader类中的addHandler()方法的作用相同。路径path可以是绝对路径(路径以/开头),也可以是相对路径(假设是当前路径的子节点路径)。

移除指定路径上的ElementHandler实例。路径可以是相对路径,也可以是绝对路径。

该方法得到当前节点的路径,该方法返回的是完整的绝对路径。

Element类

方法名定义
getText()元素所罕有的text内容,如果内容为空则返回一个空字符串而不是null
attributeValue()元素的某个指定属性所含有的值
elementIterator()元素属性的iterator,其中每个元素都是Element

DocumentHelper类

DocumentHelper是用来生成XML文档的工厂类

 


❤️ END ❤️
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值